Aufgaben-Metadaten
WARNING
Vitest stellt eine experimentelle private API zur Verfügung. Breaking Changes halten sich möglicherweise nicht an SemVer. Bitte pinnen Sie die Vitest-Version fest, wenn Sie diese verwenden.
Wenn Sie einen benutzerdefinierten Reporter entwickeln oder die Vitest Node.js API verwenden, kann es nützlich sein, Daten von Tests, die in verschiedenen Kontexten ausgeführt werden, an Ihren Reporter oder benutzerdefinierten Vitest-Handler weiterzugeben.
Dafür ist es nicht praktikabel, sich auf den Testkontext zu verlassen, da dieser nicht serialisiert werden kann. Mit Vitest können Sie jedoch die meta
-Property nutzen, die für jeden Task (Suite oder Test) verfügbar ist, um Daten von Ihren Tests an den Node.js-Prozess zu übermitteln. Es ist wichtig zu beachten, dass diese Kommunikation nur in eine Richtung erfolgt, da die meta
-Property nur innerhalb des Testkontexts geändert werden kann. Änderungen, die im Node.js-Kontext vorgenommen werden, sind in Ihren Tests nicht erkennbar.
Sie können die meta
-Property im Testkontext oder innerhalb der beforeAll
/afterAll
-Hooks für Suite-Tasks befüllen.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
Sobald ein Test abgeschlossen ist, sendet Vitest einen Task, der das Ergebnis und die meta
-Daten enthält, über RPC an den Node.js-Prozess und gibt diese dann in onTestCaseResult
und anderen Hooks weiter, die Zugriff auf Tasks haben. Um diesen Testfall zu verarbeiten, können Sie die Methode onTestCaseResult
in Ihrer Reporter-Implementierung verwenden:
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;
VORSICHT
Vitest verwendet verschiedene Methoden zur Kommunikation mit dem Node.js-Prozess:
- Wenn Vitest Tests in Worker-Threads ausführt, sendet es Daten über MessagePort.
- Wenn Vitest einen Kindprozess verwendet, sendet es die Daten als serialisierten Buffer über die
process.send
API. - Wenn Vitest Tests im Browser ausführt, stringifiziert es die Daten mit dem flatted-Paket.
Diese Property ist auch in jedem Test im json
-Reporter vorhanden. Stellen Sie daher sicher, dass die Daten in JSON serialisiert werden können.
Stellen Sie außerdem sicher, dass Sie Fehlereigenschaften serialisieren, bevor Sie sie setzen.
Sie können diese Informationen auch aus dem Vitest-Status abrufen, wenn die Tests abgeschlossen sind:
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';
Es ist auch möglich, Typdefinitionen bei der Verwendung von TypeScript zu erweitern:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}