Metadata úloh
WARNING
Vitest zpřístupňuje experimentální soukromé API. Změny, které porušují zpětnou kompatibilitu, nemusí být v souladu se SemVer, proto prosím při jeho používání zafixujte verzi Vitestu.
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 testů, které se spouštějí v různých kontextech, vašemu reportéru nebo vlastnímu handleru.
K dosažení tohoto cíle se nelze spoléhat na kontext testu, protože jej nelze serializovat. S Vitestem však můžete využít vlastnost meta
dostupnou u každé úlohy (sady nebo testu) ke sdílení dat mezi vašimi testy a procesem Node.js. Je důležité si uvědomit, že tato komunikace je pouze jednosměrná, protože vlastnost meta
lze upravovat pouze v kontextu testu. Jakékoli změny provedené v kontextu Node.js nebudou ve vašich testech viditelné.
Vlastnost meta
můžete vyplnit v kontextu testu nebo uvnitř hooků beforeAll
/afterAll
pro úlohy sady.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
Jakmile je test dokončen, Vitest odešle úlohu včetně výsledku a meta
do procesu Node.js pomocí RPC a poté ji nahlásí v onTestCaseResult
a dalších hookách, které mají přístup k úlohám. Pro zpracování tohoto testovacího případu můžete využít metodu onTestCaseResult
, která je dostupná ve vaší implementaci reportéru:
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;
POZOR
Vitest používá různé metody pro komunikaci s procesem Node.js.
- Pokud Vitest spouští testy uvnitř worker threadů, odešle data přes message port.
- Pokud Vitest používá child proces, data budou odeslána jako serializovaný Buffer přes
process.send
API. - Pokud Vitest spouští testy v prohlížeči, data budou serializována do řetězce pomocí balíčku flatted.
Tato vlastnost je také dostupná u každého testu v json
reportéru, takže se ujistěte, že data mohou být serializována do JSON.
Také se ujistěte, že serializujete vlastnosti Error před jejich nastavením.
Tyto informace můžete také získat ze stavu Vitestu po dokončení běhu testů:
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';
Při použití TypeScriptu je také možné rozšířit definice typů:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}