Check testing conventions if want to understand the reasoning behind our testing strategy and setup.
pnpm test:unit
These include pure function tests, react hook tests and component tests.
They use MSW to intercept any network call.
Any module/hook that uses onchain calls should be injected via a context provider and we should mock its public API.
pnpm test:integration
These are tests over any module/hook that uses onchain calls. vitest finds them by their special filename .integration.spec..
We use a separate vitest configuration for these onchain tests that run against an anvil fork.
TBD.
Next 13 and RSC are very new and testing is not yet mature enough so the testing strategy above could change when they finally release better testing tools/recommendations.
Related threads:
- vitests are run in watch mode by default.
- next currently uses a global webpack watcher for HMR.
- It is possible that vitest tests are rerun by next watcher if you have it running in another tab.
There are many different testing strategies and flavours by different authors but this is an extended one in frontend:
The more your tests resemble the way your software is used, the more confidence they can give you.
That means that the more we test features by interacting with the component's UI the better. However, our context is special because we normally have complex logic with many edge cases that makes it challenging and cumbersome to test from the UI. A general advise would be extracting that logic to hook/s so that we can have tests that are faster and simpler to code, understand and maintain. Then leave component tests for the happy paths.
From react hooks testing library:
When to test hooks instead of components: You have a complex hook that is difficult to test through component interactions 👈 We will have this scenario in many cases
- Improve builder/mock/fake namespaces and conventions
- For now, everything starting with a/some (i.e. aTokenBase, someTokenAmounts ) is a builder that will be used by mocks (from a unit test itself or from MSW handlers).
- Improve react-query dependency handling:
- wagmi depends on react-query and we use react-query in tests so we need to enforce that both use the same version
- We are using pnpm.overrides option for that but maybe there is a better solution
- Improve wagmi account connection to test connection related edge-cases:
- We are using a global vi.mock('wagmi') for now (see setup.vitest.tsx)
- Add e2e smoke tests using playwright and anvil
- Extend anvil setup to use other chains than mainnet
- Push anvil cache to use in CI
- Add automatic retries to Test-Integration GHA to avoid false positives due to connectivity problems (see )
- Use createProxy from @viem/anvil to boost integration tests by using a different instance by vitest thread.
Kudos to wagmi and viem repos where we got most of the ideas for anvil integration testing.
Check testing conventions if want to understand the reasoning behind our testing strategy and setup.