Métadonnées des tâches
WARNING
Vitest fournit une API privée expérimentale. Les changements majeurs peuvent ne pas respecter le versionnage sémantique (semver). Veuillez donc figer la version de Vitest lors de son utilisation.
Si vous développez un rapporteur personnalisé ou utilisez l'API Node.js de Vitest, il peut être utile de transmettre des données des tests en cours d'exécution à votre rapporteur ou à votre gestionnaire Vitest personnalisé.
Pour ce faire, l'utilisation du contexte de test n'est pas appropriée car il ne peut pas être sérialisé. Cependant, Vitest vous permet d'utiliser la propriété meta
disponible sur chaque tâche (suite ou test) pour partager des données entre vos tests et le processus Node.js. Il est important de noter que cette communication est unidirectionnelle, car la propriété meta
ne peut être modifiée que depuis le contexte de test. Toute modification effectuée dans le contexte Node.js ne sera pas visible dans vos tests.
Vous pouvez renseigner la propriété meta
dans le contexte de test ou à l'intérieur des hooks beforeAll
et afterAll
pour les tâches de suite.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
Une fois qu'un test est terminé, Vitest enverra une tâche incluant le résultat et meta
au processus Node.js en utilisant l'appel de procédure distante (RPC). Pour intercepter et traiter cette tâche, vous pouvez utiliser la méthode onTaskUpdate
disponible dans l'implémentation de votre rapporteur :
// custom-reporter.js
export default {
// you can intercept packs if needed
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta is located on every task inside "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest peut envoyer plusieurs tâches simultanément si plusieurs tests se terminent rapidement.
BEWARE
Vitest utilise différentes méthodes pour communiquer avec le processus Node.js.
- Si Vitest exécute des tests dans des threads de travail, il enverra les données via un port de message.
- Si Vitest utilise un processus enfant, les données seront envoyées sous forme de Buffer sérialisé via l'API
process.send
. - Si Vitest exécute des tests dans le navigateur, les données seront transformées en chaîne de caractères à l'aide du package flatted.
En règle générale, vous pouvez envoyer presque tout, à l'exception des fonctions, des Promises, des expressions régulières (car v8.stringify
ne peut pas les sérialiser, mais vous pouvez envoyer une version chaîne et l'analyser vous-même dans le processus Node.js), et d'autres données non sérialisables. Les références cycliques sont cependant autorisées.
Assurez-vous également de sérialiser les propriétés d'erreur avant de les attribuer.
Vous pouvez également obtenir ces informations à partir de l'état de Vitest une fois les tests exécutés :
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'
Il est également possible d'étendre les définitions de type lors de l'utilisation de TypeScript :
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}