Metadane Zadań
WARNING
Vitest udostępnia eksperymentalne, prywatne API. Zmiany powodujące niezgodność wsteczną mogą nie być zgodne z zasadami semver, dlatego zaleca się przypisanie konkretnej wersji Vitest podczas korzystania z tego API.
Jeśli tworzysz niestandardowy reporter lub korzystasz z API Vitest Node.js, przydatne może być przekazywanie danych z testów (wykonywanych w różnych kontekstach) do reportera lub niestandardowego handlera Vitest.
Aby to osiągnąć, nie można polegać na kontekście testu, ponieważ nie podlega on serializacji. Vitest umożliwia jednak użycie właściwości meta
dostępnej dla każdego zadania (suite lub test), aby udostępniać dane między testami a procesem Node.js. Należy pamiętać, że komunikacja ta jest jednokierunkowa, ponieważ właściwość meta
może być modyfikowana tylko z poziomu kontekstu testowego. Zmiany w kontekście Node.js nie będą odzwierciedlone w testach.
Możesz wypełnić właściwość meta
w kontekście testowym lub w hookach beforeAll
/afterAll
dla zadań suite.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
Po zakończeniu testu Vitest wysyła do procesu Node.js zadanie zawierające wynik i metadane (meta
) za pośrednictwem RPC. Aby przechwycić i przetworzyć zadanie, możesz użyć metody onTaskUpdate
dostępnej w implementacji reportera:
// custom-reporter.js
export default {
// można przechwytywać pakiety w razie potrzeby
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta znajduje się w każdym zadaniu wewnątrz "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest może wysyłać kilka zadań jednocześnie, jeśli wiele testów zostanie ukończonych w krótkim czasie.
BEWARE
Vitest używa różnych metod do komunikacji z procesem Node.js.
- Jeśli Vitest uruchamia testy w wątkach roboczych, dane zostaną wysłane przez port wiadomości.
- Jeśli Vitest używa procesu potomnego, dane zostaną wysłane jako zserializowany Buffer za pośrednictwem API
process.send
. - Jeśli Vitest uruchamia testy w przeglądarce, dane zostaną zserializowane do postaci ciągu znaków (stringified) za pomocą pakietu flatted.
Ogólnie rzecz biorąc, można przesyłać niemal wszystkie typy danych. Wyjątkiem są funkcje, obiekty Promise, wyrażenia regularne (RegExp) (których v8.stringify
nie potrafi serializować – można jednak przesłać ich tekstową reprezentację i zinterpretować ją samodzielnie w procesie Node.js) oraz inne dane, które nie podlegają serializacji. Dozwolone są natomiast referencje cykliczne.
Należy również upewnić się, że właściwości błędów (Error) są serializowane przed ustawieniem.
Informacje te można również uzyskać ze stanu Vitest po zakończeniu testów:
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'
Podczas korzystania z TypeScript możliwe jest również rozszerzenie definicji typów:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}