Passer au contenu

Métadonnées des tâches

Si vous développez un reporter personnalisé ou utilisez l’API Node.js de Vitest, il peut être utile de passer des données depuis les tests qui sont exécutés dans divers contextes à votre reporter ou gestionnaire personnalisé de Vitest.

Pour ce faire, s’appuyer sur le contexte de test n’est pas faisable car il ne peut pas être sérialisé. Cependant, avec Vitest, vous pouvez 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. Les modifications apportées dans le contexte Node.js ne seront pas visibles dans vos tests.

Vous pouvez remplir la propriété meta dans le contexte de test ou à l’intérieur des hooks beforeAll/afterAll pour les tâches de suite.

afterAll((suite) => {
suite.meta.done = true
})
test('personnalisé', ({ task }) => {
task.meta.custom = 'certain-handler-personnalisé'
})

Une fois qu’un test est terminé, Vitest enverra une tâche comprenant le résultat et meta au processus Node.js en utilisant RPC. Pour intercepter et traiter cette tâche, vous pouvez utiliser la méthode onTaskUpdate disponible dans votre implémentation de reporter :

custom-reporter.js
export default {
// vous pouvez intercepter des paquets si nécessaire
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta est situé sur chaque tâche à l'intérieur de "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'certain-handler-personnalisé'
}
}

Vous pouvez également obtenir cette information à partir de l’état de Vitest lorsque les tests ont terminé de s’exécuter :

const vitest = await createVitest('test')
await vitest.start()
vitest.state.getFiles()[0].meta.done === true
vitest.state.getFiles()[0].tasks[0].meta.custom === 'certain-handler-personnalisé'

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
}
}