任务元数据
警告
Vitest 公开了实验性的私有 API。重大变更可能不遵循 SemVer,请在使用时固定 Vitest 的版本。
如果您正在开发自定义 Reporter 或使用 Vitest Node.js API,您可能会发现将从各种上下文中执行的测试中的数据传递到您的 Reporter 或自定义 Vitest 处理程序很有用。
为了实现这一点,依赖于 测试上下文 是不可行的,因为它无法序列化。但是,使用 Vitest,您可以利用每个任务(套件或测试)上可用的 meta
属性在您的测试和 Node.js 进程之间共享数据。重要的是要注意,这种通信是单向的,因为 meta
属性只能从测试上下文中修改。在 Node.js 上下文中进行的任何更改在您的测试中都不可见。
您可以在测试上下文中或套件任务的 beforeAll
/afterAll
钩子中填充 meta
属性。
ts
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
一旦测试完成,Vitest 将使用 RPC 将包含结果和 meta
的任务发送到 Node.js 进程。要拦截和处理此任务,您可以利用 Reporter 实现中可用的 onTaskUpdate
方法。
ts
// 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'
}
}
警告
如果多个测试在短时间内完成,Vitest 可以同时发送多个任务。
注意
Vitest 使用不同的方法与 Node.js 进程通信。
- 如果 Vitest 在工作线程中运行测试,它将通过 消息端口 发送数据。
- 如果 Vitest 使用子进程,数据将作为序列化缓冲区通过
process.send
API 发送。 - 如果 Vitest 在浏览器中运行测试,数据将使用 flatted 包进行字符串化。
一般来说,您可以发送几乎所有东西,除了函数、Promise、regexp(v8.stringify
无法序列化它,但您可以发送字符串版本并在 Node.js 进程中自行解析它)和其他不可序列化的数据,但您可以在其中包含循环引用。
此外,请确保在设置之前序列化 错误属性。
您也可以在测试运行完成后从 Vitest 状态中获取此信息。
ts
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'
在使用 TypeScript 时,还可以扩展类型定义。
ts
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}