Metadane zadań
WARNING
Vitest udostępnia eksperymentalne prywatne API. Zmiany powodujące niezgodność wsteczną mogą nie być zgodne z SemVer, dlatego zaleca się przypięcie wersji Vitest, gdy z niego korzystasz.
Jeśli tworzysz własny raport lub używasz API Vitest Node.js, przydatne może być przekazywanie danych z testów wykonywanych w różnych kontekstach do Twojego reportera lub niestandardowego handlera Vitest.
Aby to osiągnąć, opieranie się na kontekście testu nie jest możliwe, ponieważ nie można go serializować. Jednak z Vitest możesz wykorzystać właściwość meta
dostępną dla każdego zadania (grupy testów lub pojedynczego testu), aby udostępniać dane między testami a procesem Node.js. Ważne jest, aby pamiętać, że komunikacja ta jest jednokierunkowa, ponieważ właściwość meta
może być modyfikowana tylko w kontekście testu. Wszelkie zmiany wprowadzone w kontekście Node.js nie będą widoczne w testach.
Możesz uzupełnić właściwość meta
w kontekście testu lub w hookach beforeAll
/afterAll
dla grup testów.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
Po zakończeniu testu Vitest prześle zadanie zawierające wynik i meta
do procesu Node.js za pomocą RPC, a następnie udostępni je w onTestCaseResult
i innych hookach, które mają dostęp do zadań. Aby przetworzyć ten wynik testu, możesz użyć metody onTestCaseResult
dostępnej w Twojej implementacji reportera:
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;
BEWARE
Vitest używa różnych metod do komunikacji z procesem Node.js.
- Jeśli Vitest uruchamia testy w wątkach roboczych, prześle dane za pośrednictwem portu wiadomości
- Jeśli Vitest używa procesu potomnego, dane zostaną przesłane jako serializowany bufor za pośrednictwem API
process.send
- Jeśli Vitest uruchamia testy w przeglądarce, dane zostaną zserializowane do ciągu znaków za pomocą pakietu flatted
Ta właściwość jest również dostępna w każdym teście w raporcie json
, więc upewnij się, że dane mogą być serializowane do formatu JSON.
Upewnij się również, że serializujesz obiekty błędów zanim je przypiszesz.
Możesz również uzyskać te informacje z obiektu stanu Vitest po zakończeniu testów:
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';
Można również rozszerzyć definicje typów, gdy korzystasz z TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}