Metadata úloh
WARNING
Vitest zpřístupňuje experimentální privátní API. Změny, které způsobují nekompatibilitu, nemusí dodržovat sémantické verzování (semver). Proto při jeho používání doporučujeme pevně stanovit verzi Vitest.
Pokud vyvíjíte vlastní reportér nebo používáte Vitest Node.js API, může být užitečné předávat data z úloh spouštěných v různých kontextech do vašeho reportéru nebo vlastního handleru Vitest.
Pro tento účel nelze použít testovací kontext, protože jej nelze serializovat. Nicméně, Vitest umožňuje využít vlastnost meta
, která je dostupná pro každou úlohu (sadu nebo test), ke sdílení dat mezi testy a procesem Node.js. Důležité je, že tato komunikace je jednosměrná. Vlastnost meta
lze upravit pouze z testovacího kontextu. Změny provedené v Node.js kontextu se v testech neprojeví.
Vlastnost meta
můžete naplnit v testovacím kontextu nebo v hookách beforeAll
a afterAll
pro sadu úloh.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
Po dokončení testu Vitest odešle úlohu, včetně výsledku a metadat (meta
), do procesu Node.js pomocí RPC. Pro zachycení a zpracování této úlohy můžete využít metodu onTaskUpdate
, která je dostupná ve vaší implementaci reportéru:
// custom-reporter.js
export default {
// můžete zachytávat balíčky, pokud je to nutné
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta se nachází u každé úlohy uvnitř "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest může odeslat několik úloh současně, pokud je dokončeno více testů v krátkém časovém úseku.
POZOR
Vitest používá různé metody pro komunikaci s procesem Node.js.
- Pokud Vitest spouští testy uvnitř pracovních vláken (worker threads), data se odesílají přes message port.
- Pokud Vitest používá child process, data se odesílají jako serializovaný Buffer přes
process.send
API. - Pokud Vitest spouští testy v prohlížeči, data se serializují pomocí balíčku flatted.
Obecně platí, že můžete odeslat téměř cokoliv kromě funkcí, Promises a regexp ( v8.stringify
je neumí serializovat, ale můžete odeslat jejich řetězcovou reprezentaci a tu parsovat v Node.js procesu) a dalších neserializovatelných dat. Cyklické reference jsou povoleny.
Také se ujistěte, že serializujete vlastnosti Error objektu předtím, než je nastavíte.
Tyto informace můžete také získat ze stavu Vitest po dokončení testů:
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'
V TypeScriptu je také možné rozšířit definice typů:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}