进阶 vitest.dev 2026-10-22 19:00:41 · 16 阅读

第12章 Vitest 源码内测试指南

在源码中测试 Vitest 允许在源代码内部编写测试,与实现逻辑并置,类似 Rust 的模块测试。这种方式让测试与实现共享相同的闭包,从而无需导出即可测试私有状态。同时,它也缩短了开发过程中的反馈循环。注意 本指南说明如何在源代码内部编写测试。如果需要在独立的测试文件中编写测试,请遵循“编写测试”指南。 设置 要开始使用,请在源文件末尾添加一个 if (import.meta.vitest) 代码块,并在其中编写测试。例如: 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/ 下的文件: vitest.config.ts import { defineConfig } from 'vitest/config' export default defineConfig({ test: { includeSource: ['src//*.{js,ts}'], }, }) 现在就可以开始测试了! bash $ npx vitest 生产构建 在生产构建中,需要在配置文件中设置 define 选项,让打包器进行死代码消除。例如,在 Vite 中: vite.config.ts /// import { defineConfig } from 'vite' export default defineConfig({ test: { includeSource: ['src//*.{js,ts}'], }, define: { 'import.meta.vitest': 'undefined', }, }) 其他打包器 Rolldown rolldown.config.js import { defineConfig } from 'rolldown/config' export default defineConfig({ transform: { define: { 'import.meta.vitest': 'undefined', }, }, }) 了解更多:Rolldown Rollup rollup.config.js import replace from '@rollup/plugin-replace' export default { plugins: [ replace({ 'import.meta.vitest': 'undefined', }) ], // 其他选项 } 了解更多:Rollup unbuild build.config.js import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ replace: { 'import.meta.vitest': 'undefined', }, // 其他选项 }) 了解更多:unbuild webpack webpack.config.js const webpack = require('webpack') module.exports = { plugins: [ new webpack.DefinePlugin({ 'import.meta.vitest': 'undefined', }) ], } 了解更多:webpack TypeScript 要为 import.meta.vitest 提供 TypeScript 支持,请在 tsconfig.json 中添加 vitest/importMeta: tsconfig.json { "compilerOptions": { "types": [ "vitest/importMeta" ] } } 完整示例请参阅 examples/in-source-test。 注意 在源码内测试中使用 assert 等断言函数时存在限制。详情请参阅 assert 文档及解决方案。 备注 此功能适用于: 小范围函数或工具函数的单元测试 原型开发 内联断言 对于更复杂的测试(如组件测试或 E2E 测试),建议使用独立的测试文件。

评论 (0)