タスクメタデータ
警告
Vitestは実験的なプライベートAPIを公開しています。破壊的変更はセムバーを遵守しない可能性があるので、それを使用する場合にはVitestのバージョンをピン止めしてください。
カスタムレポーターの開発またはVitest Node.js APIの使用の場合は、レポーターやカスタムVitestハンドラーに、さまざまなコンテキストで実行されるテストからデータを渡すことが有用になる場合があります。
これを実現するには、シリアライズできないため、テストコンテキストに依存することはできません。ただし、Vitestを使用すると、すべてのタスク(スイートまたはテスト)で利用可能なmeta
プロパティを利用して、テストとNode.jsプロセス間でデータを共有できます。この通信は一方向のみであることに注意することが重要です。meta
プロパティはテストコンテキスト内からのみ変更できるためです。Node.jsコンテキスト内で行われた変更はテストでは表示されません。
meta
プロパティに値を設定するのは、テストコンテキストまたはスイートタスクのbeforeAll
/afterAll
フック内で行えます。
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
テストが完了すると、Vitestは結果とmeta
を含むタスクをRPCを使用してNode.jsプロセスに送信します。このタスクをインターセプトして処理するには、レポーターの実装で使用可能なonTaskUpdate
メソッドを利用できます
// custom-reporter.js
export default {
// you can intercept packs if needed
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta is located on every task inside "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
警告
いくつかのテストが短期間に完了した場合、Vitestは同時にいくつかのタスクを送信できます。
注意
Vitestは、Node.jsプロセスとの通信にさまざまな方法を使用しています。
- Vitestがワーカーのスレッド内でテストを実行する場合、メッセージポートを使用してデータを送信します
- Vitestが子プロセスを使用する場合、データは
process.send
APIを介してシリアライズされたバッファーとして送信されます - Vitestがブラウザでテストを実行する場合、データはflattedパッケージを使用して文字列に変換されます
一般的な経験則として、関数、Promise、正規表現(v8.stringify
でシリアライズできません。ただし、文字列バージョンを送信して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
}
}