-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs: update about in-source testing
- Loading branch information
Showing
4 changed files
with
142 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
# In-source testing | ||
|
||
Vitest also provides a way to run tests with in your source code along with the implementation, simliar to [Rust's module tests](https://doc.rust-lang.org/book/ch11-03-test-organization.html#the-tests-module-and-cfgtest). | ||
|
||
This makes the tests share the same closure as the implementations and able to test against private states without exporting. Meanwhile, it also brings the closer feedback loop for development. | ||
|
||
## Setup | ||
|
||
To get started, put a `if (import.meta.vitest)` block at the end of your source file and write some tests inside it. For example: | ||
|
||
```ts | ||
// src/index.ts | ||
|
||
// the implementation | ||
export function add(...args: number[]) { | ||
return args.reduce((a, b) => a + b, 0) | ||
} | ||
|
||
// in-source test suites | ||
if (import.meta.vitest) { | ||
const { it, expect } = import.meta.vitest | ||
it('add', () => { | ||
expect(add()).toBe(0) | ||
expect(add(1)).toBe(1) | ||
expect(add(1, 2, 3)).toBe(6) | ||
}) | ||
} | ||
``` | ||
|
||
Update the `includeSource` config for Vitest to grab the files under `src/`: | ||
|
||
```ts | ||
// vite.config.ts | ||
import { defineConfig } from 'vitest/config' | ||
|
||
export default defineConfig({ | ||
test: { | ||
includeSource: ['src/**/*.{js,ts}'], | ||
}, | ||
}) | ||
``` | ||
|
||
Then you can start to test! | ||
|
||
```bash | ||
$ npx vitest | ||
``` | ||
|
||
## Production build | ||
|
||
For production build, you will need to set the `define` options in your config file, letting the bundler to do the dead code elimination. For example, in Vite | ||
|
||
```diff | ||
// vite.config.ts | ||
import { defineConfig } from 'vitest/config' | ||
|
||
export default defineConfig({ | ||
+ define: { | ||
+ 'import.meta.vitest': 'undefined', | ||
+ }, | ||
test: { | ||
includeSource: ['src/**/*.{js,ts}'] | ||
}, | ||
}) | ||
``` | ||
|
||
### Other Bundlers | ||
|
||
<details mt4> | ||
<summary text-xl>unbuild</summary> | ||
|
||
```diff | ||
// build.config.ts | ||
import { defineConfig } from 'unbuild' | ||
|
||
export default defineConfig({ | ||
+ replace: { | ||
+ 'import.meta.vitest': 'undefined', | ||
+ }, | ||
// other options | ||
}) | ||
``` | ||
|
||
Learn more: <a href="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/unjs/unbuild" target="_blank">unbuild</a> | ||
|
||
</details> | ||
|
||
<details my2> | ||
<summary text-xl>rollup</summary> | ||
|
||
```diff | ||
// rollup.config.js | ||
+ import replace from '@rollup/plugin-replace' | ||
|
||
export default { | ||
plugins: [ | ||
+ replace({ | ||
+ 'import.meta.vitest': 'undefined', | ||
+ }) | ||
], | ||
// other options | ||
} | ||
``` | ||
|
||
Learn more: <a href="https://rollupjs.org/" target="_blank">rollup</a> | ||
|
||
</details> | ||
|
||
## TypeScript | ||
|
||
To get TypeScript support for `import.meta.vitest`, add `vitest/importMeta` to your `tsconfig.json`: | ||
|
||
```diff | ||
// tsconfig.json | ||
{ | ||
"compilerOptions": { | ||
"types": [ | ||
+ "vitest/importMeta" | ||
] | ||
} | ||
} | ||
``` | ||
|
||
Reference to [`test/import-meta`](https://github.com/vitest-dev/vitest/tree/main/test/import-meta) for the full example. | ||
|
||
## Notes | ||
|
||
This feature could be useful for: | ||
|
||
- Unit testing for small-scoped functions or utilities | ||
- Prototyping | ||
- Inline Assertion | ||
|
||
It's recommended to **use separate test files instead** for more complex tests like components or E2E testing. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters