內聯測試
Vitest 提供一種在原始碼中與實作並行執行測試的方式,類似於 Rust 的模組測試。
這使得測試與實作共享相同的閉包環境,並且能夠在不匯出的情況下測試私有狀態。同時,它也為開發帶來更緊密的回饋循環。
WARNING
本指南說明如何在原始碼中撰寫測試。如果您需要在單獨的測試檔案中撰寫測試,請遵循「撰寫測試」指南。
設定
首先,在原始碼檔案的末尾放置一個 if (import.meta.vitest)
程式碼區塊,並在其中撰寫一些測試。例如:
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
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
includeSource: ['src/**/*.{js,ts}'],
},
});
然後您就可以開始測試了!
bash
$ npx vitest
生產環境建置
對於生產環境建置,您需要在配置檔中設置 define
選項,讓打包器執行死碼消除。例如,在 Vite 中:
ts
/// <reference types="vitest/config" />
import { defineConfig } from 'vite'
export default defineConfig({
test: {
includeSource: ['src/**/*.{js,ts}'],
},
define: {
'import.meta.vitest': 'undefined',
},
})
其他打包器
unbuild
ts
import { defineBuildConfig } from 'unbuild'
export default defineBuildConfig({
replace: {
'import.meta.vitest': 'undefined',
},
// other options
})
了解更多:unbuild
Rollup
ts
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
:
json
{
"compilerOptions": {
"types": [
"vitest/importMeta"
]
}
}
參考 examples/in-source-test
以獲取完整的範例。
注意事項
此功能對於以下情況可能很有用:
- 用於小型範圍的函數或工具的單元測試
- 原型設計
- 內聯斷言
對於更複雜的測試(例如元件或 E2E 測試),建議改用單獨的測試檔案。