Aufgaben-Metadaten
WARNING
Vitest stellt experimentelle, private APIs zur Verfügung. Inkompatible Änderungen können ohne Beachtung der SemVer-Regeln erfolgen. Bitte fixieren Sie die Vitest-Version, wenn Sie diese verwenden.
Beim Entwickeln eines benutzerdefinierten Reporters oder bei der Verwendung der Vitest Node.js API kann es hilfreich sein, Daten von Tests, die in verschiedenen Kontexten ausgeführt werden, an Ihren Reporter oder benutzerdefinierten Vitest-Handler zu übermitteln.
Es ist nicht praktikabel, sich hierbei auf den Testkontext zu verlassen, da dieser nicht serialisiert werden kann. Vitest bietet Ihnen jedoch die Möglichkeit, die meta
-Eigenschaft zu nutzen, die für jede Aufgabe (Suite oder Test) verfügbar ist, um Daten zwischen Ihren Tests und dem Node.js-Prozess auszutauschen. Beachten Sie, dass diese Kommunikation unidirektional ist, da die meta
-Eigenschaft nur im Testkontext geändert werden kann. Änderungen im Node.js-Kontext sind in Ihren Tests nicht sichtbar.
Sie können die meta
-Eigenschaft im Testkontext oder innerhalb der beforeAll
/afterAll
-Hooks für Suite-Aufgaben setzen.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
Sobald ein Test abgeschlossen ist, sendet Vitest eine Aufgabe, die das Ergebnis und die meta
-Daten über RPC an den Node.js-Prozess enthält. Um diese Aufgabe abzufangen und zu verarbeiten, können Sie die onTaskUpdate
-Methode verwenden, die in Ihrer Reporter-Implementierung zur Verfügung steht:
// custom-reporter.js
export default {
// Sie können Packs bei Bedarf abfangen
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// Meta-Daten befinden sich in jeder Aufgabe innerhalb von "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest kann mehrere Aufgaben gleichzeitig senden, wenn mehrere Tests in kurzer Zeit abgeschlossen werden.
Vorsicht:
Vitest verwendet verschiedene Methoden, um mit dem Node.js-Prozess zu kommunizieren.
- Vitest sendet die Daten über den Message Port, wenn Tests in Worker-Threads ausgeführt werden.
- Bei Verwendung eines Child-Prozesses werden die Daten als serialisierter Puffer über die
process.send
API gesendet. - Wenn Vitest Tests im Browser ausführt, werden die Daten mit dem flatted Paket in einen String serialisiert.
Im Allgemeinen können Sie nahezu alles senden. Ausnahmen sind Funktionen, Promises, Regexp (v8.stringify
kann diese nicht serialisieren; senden Sie stattdessen eine String-Repräsentation und parsen Sie diese im Node.js-Prozess) und andere nicht serialisierbare Daten. Zyklische Referenzen sind jedoch erlaubt.
Achten Sie außerdem darauf, dass Sie Error-Eigenschaften serialisieren, bevor Sie sie setzen.
Sie können diese Informationen auch aus dem Status von Vitest beziehen, nachdem die Tests abgeschlossen wurden:
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'
Bei Verwendung von TypeScript können Sie auch Typdefinitionen erweitern:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}