Open2

Vitest 2.0 変更まとめ

しーさんしーさん

Breaking Change

poolのデフォルト値がforksに変更

1.x系ではデフォルト値がthreadsだった。
threadspoolの違いは内部的に使用しているtinypoolのメソッドをworker_threadsの代わりにchild_processを使用している点。

poolを指定しないでpoolOptionsを設定している場合は影響がある。

export default defineConfig({
  test: {
    poolOptions: {
-      threads: { 
-       singleThread: true, 
-     }, 
+     forks: { 
+      singleFork: true, 
+    }, 
    }
  }
})

フックがスタックで実行される

v2.0以前はフックが並列で実行されていたが、直列で実行されるように変更。
こちらもsequence.hooksのデフォルト値がparallelからstackに変更された。
stackに変更されることでafterAll/afterEachの実行順に影響があるらしい。

例)

import { afterAll, test, expect } from "vitest";

afterAll(() => {
  console.log("afterAll 1");
});

afterAll(() => {
  console.log("afterAll 2");
});

test("1", () => {
  expect(1 + 1).toBe(2);
});
  • sequence.hooks = "parallel"の場合

  • sequence.hooks = "stack"の場合

suite.concurrentですべてのテストが同時実行されるようになる

以前は特定のスイートごとに同時実行され、スイートは順番に実行されていたが、Jestの仕様に倣って全テストが同時実行されるようになる。(同時実行数自体はmaxConcurrencyで指定可能)

coverage.ignoreEmptyLinesがデフォルトで有効に

esbuildだとトランスパイルされるときにTypescriptの型とかコメントが削除されるけど、それを無視するようにする設定。

watchExcludeオプションが削除

server.watch.ignoredに置き換わり。

--segfault-retryの削除

poolのデフォルト値が変更になったため、必要なくなった。

JSONレポーターでtask.metaが出力されるように変更

json
{
  ..., 
  "testResults": [
    {
      "assertionResults": [
        {
          "ancestorTitles": [],
          "fullName": "1",
          "status": "passed",
          "title": "1",
          "duration": 1,
          "failureMessages": [],
+          "meta": { "custom": "sampe-meta" }
        }
      ],
      "startTime": 1721891818124,
      "endTime": 1721891818125,
      "status": "passed",
      "message": "",
      "name": "..."
    }
  ]
}

モック関数の型定義の簡略化

vi.fnMockなどのモック関数の型定義としてパラメータと返却値をそれぞれジェネリクスで渡す必要があったが、関数の型だけを渡せばよくなった。

ts
import { type Mock, vi } from 'vitest'

const add = (x: number, y: number): number => x + y

// using vi.fn<T>

const mockAdd = vi.fn<typeof add>() 

// using Mock<T>

const mockAdd: Mock<typeof add> = vi.fn() 

Resolveされたmocks.resultへのアクセス方法の変更

以前はモック関数がPromiseを返却したとき、mock.resultsはResolveされた型を返却していた。
新たにPromiseの結果を持つmock.settledResultsが追加され、Resolveされた型を返却する。
(mock.resultsはPromise型を返却する)

ts
const fn = vi.fn().mockResolvedValueOnce('result')
await fn()

- const result = fn.mock.results[0] // 'result'
+ const result = fn.mock.results[0] // 'Promise<result>'

const settledResult = fn.mock.settledResults[0] // 'result'

これに関連して新規にtoHaveResolvedが追加される

ts
const fn = vi.fn().mockResolvedValueOnce('result')
await fn()

- expect(fn).toHaveReturned('result') 
+ expect(fn).toHaveResolved('result') 

ブラウザモード

  • noneプロバイダーがpreviewにリネーム
  • previewプロバイダーがデフォルト値
  • indexScriptsorchestratorScriptsにリネーム

Deprecated

  • vitest typecheckコマンド
    • vitest --typecheckに変更
  • VITEST_JUNIT_CLASSNAMEVITEST_JUNIT_SUITE_NAMEの環境変数
    • レポーターのオプションで設定する
  • c8のカバレッジチェック
    • coverage-v8を代わりに使用する
  • SnapshotEnvironmentvitestからのexport
    • vitest/snapshotからインポートできる
  • SpyInstance
    • MockInstanceを使用