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