タスクのメタデータ
WARNING
Vitest は実験的なプライベート API を公開しています。破壊的変更が SemVer に準拠しない可能性があるため、使用する際は 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 プロセスに送信し、onTestCaseResult
およびタスクにアクセスできる他のフックでそのタスクを報告します。このテストケースを処理するには、レポーターの実装で利用可能な onTestCaseResult
メソッドを使用できます。
import type { Reporter, TestCase, TestModule } from 'vitest/node';
export default {
onTestCaseResult(testCase: TestCase) {
// custom === 'some-custom-handler' ✅
const { custom } = testCase.meta();
},
onTestRunEnd(testModule: TestModule) {
testModule.meta().done === true;
testModule.children.at(0).meta().custom === 'some-custom-handler';
},
} satisfies Reporter;
注意
Vitest は Node.js プロセスとの通信に異なる方法を使用します。
- Vitest がワーカー スレッドでテストを実行する場合、データは メッセージポート を介して送信されます。
- Vitest が子プロセスを使用する場合、データは
process.send
API を介してシリアライズされた Buffer として送信されます。 - Vitest がブラウザでテストを実行する場合、データは flatted パッケージを使用して文字列に変換されます。
このプロパティは json
レポーターではすべてのテストにも存在するため、データが JSON にシリアライズ可能であることを確認してください。
また、Error プロパティ を設定する前にシリアライズしてください。
テストの実行終了後、Vitest の状態からこの情報を取得することもできます。
const vitest = await createVitest('test');
const { testModules } = await vitest.start();
const testModule = testModules[0];
testModule.meta().done === true;
testModule.children.at(0).meta().custom === 'some-custom-handler';
TypeScript を使用している場合、型定義を拡張することも可能です。
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}