タスクメタデータ
WARNING
Vitest は実験的なプライベート API を公開しています。破壊的な変更はセマンティックバージョニングに従わない可能性があるため、使用する際は Vitest のバージョンを固定してください。
カスタムレポーターの開発や Vitest Node.js API の使用時など、様々な状況で、実行されるテストからレポーターやカスタム Vitest ハンドラーへデータを渡したい場合があります。
これを実現するために、シリアライズできないテストコンテキストに依存することはできません。しかし、Vitest では、すべてのタスク(スイートまたはテスト)で利用可能な meta
プロパティを使用して、テストと Node.js プロセス間でデータを共有できます。重要な点として、この通信は一方向のみです。meta
プロパティはテストコンテキスト内からのみ変更できます。Node.js コンテキストで行われた変更は、テスト内では反映されません。
テストコンテキストまたはテストスイートの beforeAll
/afterAll
フック内で meta
プロパティを設定できます。
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
テストが完了すると、Vitest は RPC を介して、結果と meta
を含むタスクを Node.js プロセスに送信します。このタスクをインターセプトして処理するには、リポーターの実装で利用できる onTaskUpdate
メソッドを使用します。
// custom-reporter.js
export default {
// 必要に応じて、パックをインターセプトすることも可能です
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta は "onFinished" 内のすべてのタスクにあります
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
複数のテストが短時間で完了した場合、Vitest は複数のタスクをまとめて送信することがあります。
BEWARE
Vitest は、Node.js プロセスとの通信に異なる方法を使用します。
- Vitest がワーカースレッド内でテストを実行する場合、メッセージポート を介してデータを送信します。
- Vitest が子プロセスを使用する場合、データはシリアル化された Buffer として
process.send
API を介して送信されます。 - Vitest がブラウザでテストを実行する場合、データは flatted パッケージを使用して文字列化されます。
原則として、関数、Promise、regexp など、シリアル化できないデータは送信できません(v8.stringify
では regexp をシリアル化できませんが、文字列として送信し、Node.js プロセスで解析できます)。それ以外のデータは、循環参照を含んでいても、ほとんどの場合送信可能です。
なお、Error プロパティ は、シリアル化される前に設定されている必要があります。
テストの実行が終了した後、Vitest の状態からこの情報を取得することもできます。
const vitest = await createVitest('test')
await vitest.start()
vitest.state.getFiles()[0].meta.done === true
vitest.state.getFiles()[0].tasks[0].meta.custom === 'some-custom-handler'
TypeScript を使用している場合、型定義を拡張することもできます。
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}