移行ガイド
Jest からの移行
Vitest は、Jest からの移行を可能な限り容易にするため、Jest 互換の API で設計されています。しかし、移行の際に以下の相違点に遭遇する可能性があります。
デフォルトでのグローバル変数
Jest では、グローバル API がデフォルトで有効になっています。Vitest はそうではありません。globals
設定 を使用してグローバル変数を有効にするか、vitest
モジュールからインポートするようにコードを更新してください。
グローバル変数を無効にしたままにする場合は、testing-library
などの一般的なライブラリが、自動 DOM クリーンアップ を実行しないことに注意してください。
モジュールをモックする
Jest でモジュールをモックする場合、ファクトリ関数の引数の戻り値はデフォルトのエクスポートとして扱われます。Vitest では、ファクトリ関数の引数は、各エクスポートが明示的に定義されたオブジェクトを返す必要があります。例えば、次の jest.mock
は、次のように更新する必要があります。
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })
詳細については、vi.mock
API セクション を参照してください。
自動モックの挙動
Jest とは異なり、<root>/__mocks__
内のモック化されたモジュールは、vi.mock()
が呼び出されるまでロードされません。Jest のように、すべてのテストでモックする必要がある場合は、setupFiles
内でモックを設定できます。
モック化されたパッケージのオリジナルをインポートする
パッケージを部分的にモックする場合、以前は Jest の関数 requireActual
を使用していたかもしれません。Vitest では、これらの呼び出しを vi.importActual
に置き換える必要があります。
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')
環境変数
Jest と同様に、Vitest は、設定されていない場合、NODE_ENV
を test
に設定します。Vitest には、JEST_WORKER_ID
に対応する VITEST_POOL_ID
もあります(常に maxThreads
以下)。これを使用している場合は、名前を変更してください。Vitest は、実行中のワーカーのユニーク ID である VITEST_WORKER_ID
も公開します。この数値は maxThreads
の影響を受けず、作成されたワーカーごとに増加します。
環境変数を変更する場合、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
フック関数は、Vitest で teardown 関数 を返す場合があります。そのため、undefined
または null
以外の値を返す場合は、フックの宣言を変更する必要があるかもしれません。
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })
型
Vitest の Vi
名前空間では、多くの型が公開されていません。これは主にマッチャーとの互換性のためのものであり、Vi
名前空間に依存するのではなく、vitest
から直接型をインポートする必要がある場合があります。
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>
また、差分で示されているように、Vitest では Returns
ではなく、最初の引数として Args
型を使用します。
タイマー
Vitest は、Jest のレガシータイマーをサポートしていません。
Vue のスナップショットテスト
これは Jest 特有の機能ではありませんが、以前に vue-cli プリセットで Jest を使用していた場合は、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);
そうしないと、スナップショット内の "
が多数エスケープされて表示されます。