遷移指南
從 Jest 遷移
Vitest 的設計與 Jest 的 API 相容,目的是盡可能簡化從 Jest 的遷移過程。儘管如此,您可能仍然會遇到以下差異:
預設的全域變數
Jest 預設啟用其 globals API。Vitest 則不然。您可以透過 globals
配置設定 啟用全域變數,或者更新您的程式碼以使用從 vitest
模組匯入的內容。
如果您決定保持停用全域變數,請注意,像 testing-library
這樣的常用函式庫將不會自動執行 DOM 清理。
模組模擬 (Module Mocks)
在 Jest 中模擬一個模組時,工廠函式 (factory argument) 的回傳值會作為預設匯出 (default export)。在 Vitest 中,工廠函式必須回傳一個物件,其中明確定義了每個匯出。例如,以下 jest.mock
必須更新如下:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })
更多詳細資訊請參考 vi.mock
api 章節。
自動模擬行為 (Auto-Mocking Behavior)
與 Jest 不同,除非呼叫 vi.mock()
,否則 <root>/__mocks__
中的模擬模組不會載入。如果您需要在每個測試中都模擬這些模組,就像在 Jest 中一樣,您可以在 setupFiles
中模擬這些模組。
匯入模擬套件的原始版本
如果您僅對套件進行部分模擬,您可能之前使用過 Jest 的 requireActual
函數。在 Vitest 中,您應該將這些呼叫替換為 vi.importActual
。
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')
環境變數設定 (Envs)
與 Jest 一樣,如果之前未設定,Vitest 會將 NODE_ENV
設定為 test
。Vitest 還有一個對應於 JEST_WORKER_ID
的變數,稱為 VITEST_POOL_ID
(始終小於或等於 maxThreads
)。如果您依賴此變數,請不要忘記重新命名它。Vitest 還公開了 VITEST_WORKER_ID
,它是正在執行的 worker 的唯一 ID - 這個數字不受 maxThreads
的影響,並且會隨著每個建立的 worker 而增加。
如果您想修改環境變數,在 Jest 中可以使用 replaceProperty API,而在 Vitest 中,則可以使用 vi.stubEnv 執行相同的操作。
Done 回調函式
從 Vitest v0.10.0 開始,宣告測試時使用的回調函式寫法已不再建議使用。您可以將其重寫為使用 async
/await
函數,或使用 Promise 來模擬回呼樣式。
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))
鉤子
beforeAll
/beforeEach
hooks 在 Vitest 中可以回傳 teardown 函數。因此,如果這些 hooks 回傳的不是 undefined
或 null
,您可能需要重寫您的 hooks 宣告:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })
型別 (Types)
Vitest 不會在 Vi
命名空間上公開許多型別,它主要用於與 matchers 相容。因此,您可能需要直接從 vitest
匯入型別,而不是依賴 Vi
命名空間:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>
此外,正如您在 diff 中看到的,Vitest 使用 Args
型別作為第一個參數,而非 Returns
型別。
定時器 (Timers)
Vitest 不支援 Jest 的舊版計時器。
Vue 快照 (Vue Snapshots)
這不是 Jest 特有的功能,但如果您之前使用 Jest 與 vue-cli 的預設配置,您將需要安裝 jest-serializer-vue
套件,並在 setupFiles 中使用它:
vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
test: {
setupFiles: ['./tests/unit/setup.js'],
},
});
tests/unit/setup.js
import vueSnapshotSerializer from 'jest-serializer-vue';
expect.addSnapshotSerializer(vueSnapshotSerializer);
否則,您的畫面快照將會包含許多逸出的 "
字元。