Skip to content
Vitest 0
Main Navigation 指南API配置高級
1.6.1
0.34.6

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

外觀

Sidebar Navigation

指南

為什麼使用 Vitest

開始使用

功能特性

工作區

命令列界面

測試過濾器

覆蓋率

快照

模擬(Mocking)

型別測試

Vitest UI

瀏覽器模式 (實驗性)

原始碼測試

測試上下文

測試環境

擴展匹配器

IDE 整合支援

偵錯

與其他測試執行器的比較

遷移指南

常見錯誤

API

測試 API 參考文件

模擬函數 (Mock Functions)

Vi

expect

expectTypeOf

assertType

配置

配置 Vitest

本頁導覽

遷移指南 ​

從 Jest 遷移 ​

Vitest 的設計與 Jest 的 API 相容,目的是盡可能簡化從 Jest 的遷移過程。儘管如此,您可能仍然會遇到以下差異:

預設的全域變數 ​

Jest 預設啟用其 globals API。Vitest 則不然。您可以透過 globals 配置設定 啟用全域變數,或者更新您的程式碼以使用從 vitest 模組匯入的內容。

如果您決定保持停用全域變數,請注意,像 testing-library 這樣的常用函式庫將不會自動執行 DOM 清理。

模組模擬 (Module Mocks) ​

在 Jest 中模擬一個模組時,工廠函式 (factory argument) 的回傳值會作為預設匯出 (default export)。在 Vitest 中,工廠函式必須回傳一個物件,其中明確定義了每個匯出。例如,以下 jest.mock 必須更新如下:

diff
- 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。

diff
- 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 來模擬回呼樣式。

diff
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
    // ...
    done()
- })
+ }))

鉤子 ​

beforeAll/beforeEach hooks 在 Vitest 中可以回傳 teardown 函數。因此,如果這些 hooks 回傳的不是 undefined 或 null,您可能需要重寫您的 hooks 宣告:

diff
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })

型別 (Types) ​

Vitest 不會在 Vi 命名空間上公開許多型別,它主要用於與 matchers 相容。因此,您可能需要直接從 vitest 匯入型別,而不是依賴 Vi 命名空間:

diff
- 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

js
import { defineConfig } from 'vite';

export default defineConfig({
  test: {
    setupFiles: ['./tests/unit/setup.js'],
  },
});

tests/unit/setup.js

js
import vueSnapshotSerializer from 'jest-serializer-vue';

expect.addSnapshotSerializer(vueSnapshotSerializer);

否則,您的畫面快照將會包含許多逸出的 " 字元。

Pager
上一頁與其他測試執行器的比較
下一頁常見錯誤

以 MIT 授權條款 發布。

版權所有 (c) 2024 Mithril Contributors

https://v0.vitest.dev/guide/migration

以 MIT 授權條款 發布。

版權所有 (c) 2024 Mithril Contributors