源码内测试
Vitest 还提供了一种在源代码中与实现代码一同运行测试的方法,类似于 Rust 的模块测试。
这使得测试可以与实现共享相同的闭包,并且能够在不导出任何内容的情况下测试私有状态。同时,它也能为开发带来更快的反馈循环。
设置
首先,在源文件末尾添加一个 if (import.meta.vitest)
代码块,并在其中编写测试。例如:
ts
// src/index.ts
// 实现
export function add(...args: number[]) {
return args.reduce((a, b) => a + b, 0);
}
// 源码内测试套件
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);
});
}
更新 Vitest 的 includeSource
配置,使其包含 src/
目录下的文件:
ts
// vite.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
includeSource: ['src/**/*.{js,ts}'],
},
});
然后你就可以运行测试了!
bash
$ npx vitest
生产构建
为了在生产构建中移除源码内测试代码,你需要在配置文件中设置 define
选项,以便打包器进行死代码消除。 例如,在 Vite 中:
diff
// vite.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
+ define: {
+ 'import.meta.vitest': 'undefined',
+ },
test: {
includeSource: ['src/**/*.{js,ts}']
},
})
其他打包器
unbuild
diff
// build.config.ts
import { defineBuildConfig } from 'unbuild'
export default defineBuildConfig({
+ replace: {
+ 'import.meta.vitest': 'undefined',
+ },
// other options
})
了解详情:unbuild
rollup
diff
// rollup.config.js
+ import replace from '@rollup/plugin-replace'
export default {
plugins: [
+ replace({
+ 'import.meta.vitest': 'undefined',
+ })
],
// other options
}
了解详情:rollup
TypeScript
要为 import.meta.vitest
添加 TypeScript 支持,请将 vitest/importMeta
添加到你的 tsconfig.json
的 types
数组中:
diff
// tsconfig.json
{
"compilerOptions": {
"types": [
+ "vitest/importMeta"
]
}
}
完整示例可参考 test/import-meta
。
注意事项
此功能适用于以下场景:
- 小范围函数或工具函数的单元测试
- 快速原型开发
- 内联断言
对于更复杂的测试(例如组件或 E2E 测试),建议使用单独的测试文件。