Metadati del Task
WARNING
Vitest espone API private sperimentali. Le modifiche che comportano interruzioni potrebbero non seguire SemVer. Si consiglia di bloccare la versione di Vitest quando si utilizzano queste API.
Se stai sviluppando un reporter personalizzato o utilizzando l'API Node.js di Vitest, potresti trovare utile passare dati dai test eseguiti in vari contesti al tuo reporter o al gestore Vitest personalizzato.
Per realizzare ciò, affidarsi al contesto di test non è fattibile poiché non può essere serializzato. Tuttavia, con Vitest, puoi utilizzare la proprietà meta
disponibile su ogni task (suite o test) per condividere dati tra i tuoi test e il processo Node.js. È importante notare che questa comunicazione è unidirezionale, poiché la proprietà meta
può essere modificata solo dall'interno del contesto di test. Qualsiasi modifica apportata all'interno del contesto Node.js non sarà visibile nei test.
Puoi popolare la proprietà meta
nel contesto di test o all'interno degli hook beforeAll
/afterAll
per i task della suite.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
Una volta che un test è completato, Vitest invierà un task, inclusi il risultato e meta
, al processo Node.js utilizzando RPC. Questi dati saranno poi riportati in onTestCaseResult
e altri hook che hanno accesso ai task. Per elaborare questo caso di test, puoi utilizzare il metodo onTestCaseResult
disponibile nell'implementazione del reporter:
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;
ATTENZIONE
Vitest utilizza metodi diversi per comunicare con il processo Node.js:
- Se Vitest esegue i test all'interno di worker threads, invierà i dati tramite message port.
- Se Vitest utilizza un processo figlio, i dati verranno inviati come un Buffer serializzato tramite l'API
process.send
. - Se Vitest esegue i test nel browser, i dati verranno serializzati in stringa utilizzando il pacchetto flatted.
Questa proprietà è presente anche in ogni test nel reporter json
, quindi assicurati che i dati possano essere serializzati in JSON.
Inoltre, assicurati di serializzare le proprietà di errore prima di impostarle.
Puoi anche ottenere queste informazioni dallo stato di Vitest al termine dell'esecuzione dei 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';
È anche possibile estendere le definizioni di tipo utilizzando TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}