Metadati delle attività
WARNING
Vitest espone API private sperimentali. Le modifiche che comportano breaking changes potrebbero non seguire semver, pertanto si consiglia di fissare la versione di Vitest quando la si utilizza.
Se stai sviluppando un reporter personalizzato o utilizzando l'API Node.js di Vitest, potrebbe essere utile passare dati dai test eseguiti in contesti diversi al tuo reporter o gestore Vitest personalizzato.
A questo scopo, affidarsi al contesto del test non è una soluzione praticabile, poiché non può essere serializzato. Tuttavia, con Vitest, è possibile utilizzare la proprietà meta
disponibile su ogni attività (suite o test) per condividere dati tra i tuoi test e il processo Node.js. È importante notare che la comunicazione è unidirezionale, poiché la proprietà meta
può essere modificata solo dall'interno del contesto del test. Eventuali modifiche apportate nel contesto Node.js non saranno visibili nei test.
È possibile popolare la proprietà meta
nel contesto del test o all'interno degli hook beforeAll
e afterAll
per le attività della suite.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
Al completamento di un test, Vitest invierà un'attività includendo il risultato e meta
al processo Node.js utilizzando RPC. Per intercettare ed elaborare questa attività, è possibile utilizzare il metodo onTaskUpdate
disponibile nell'implementazione del tuo reporter:
// custom-reporter.js
export default {
// puoi intercettare i pacchetti se necessario
onTaskUpdate(packs) {
const [id, result, meta] = packs[0];
},
// meta si trova su ogni attività all'interno di "onFinished"
onFinished(files) {
files[0].meta.done === true;
files[0].tasks[0].meta.custom === 'some-custom-handler';
},
};
WARNING
Vitest può inviare più attività contemporaneamente se diversi test vengono completati in un breve lasso di tempo.
BEWARE
Vitest utilizza diversi metodi di comunicazione con il processo Node.js.
- Se Vitest esegue i test all'interno di worker thread, invierà i dati tramite message port
- Se Vitest utilizza un processo figlio, i dati verranno inviati come Buffer serializzato tramite l'API
process.send
- Se Vitest esegue i test nel browser, i dati verranno convertiti in stringa utilizzando il pacchetto flatted
La regola generale è che puoi inviare quasi tutto, ad eccezione di funzioni, Promise, regexp (v8.stringify non può serializzarlo, ma puoi inviare una versione stringa e analizzarla tu stesso nel processo Node.js) e altri dati non serializzabili, ma puoi avere riferimenti ciclici al loro interno.
Inoltre, assicurati di serializzare le proprietà Error prima di impostarle.
È inoltre possibile ottenere queste informazioni dallo stato di Vitest una volta che i test hanno terminato l'esecuzione:
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';
È inoltre possibile estendere le definizioni dei tipi quando si utilizza TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}