任務元數據
WARNING
Vitest 公開了實驗性的私有 API。重大變更可能不遵循語義版本控制 (semver),使用時請固定 Vitest 的版本。
如果您正在開發自定義的報表器或使用 Vitest Node.js API,您可能會發現將在各種上下文中執行的測試資料傳遞到您的報表器或自定義 Vitest 處理程序非常有用。
爲了實現這一點,依賴 測試上下文 並不可行,因為它無法被序列化。但是,使用 Vitest,您可以利用每個任務(測試套件或測試)上可用的 meta
屬性,在您的測試和 Node.js 進程之間共享資料。重要的是要注意,這種通信是單向的,因為 meta
屬性只能從測試上下文中修改。在 Node.js 上下文中所做的任何更改在您的測試中不會生效。
您可以在測試上下文或測試套件任務的 beforeAll
/afterAll
鉤子中填充 meta
屬性。
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
測試完成後,Vitest 將使用 RPC 向 Node.js 進程發送一個包含結果和 meta
的任務。要攔截和處理此任務,您可以使用報表器實作中提供的 onTaskUpdate
方法:
// custom-reporter.js
export default {
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
如果多個測試在短時間內完成,Vitest 可能会同時發送多個任務。
BEWARE
Vitest 使用不同的方法與 Node.js 進程通信。
- 如果 Vitest 在 worker threads 內運行測試,它將通過 message port 發送資料。
- 如果 Vitest 使用子程序,資料將作為序列化的 Buffer 通過
process.send
API 發送。 - 如果 Vitest 在瀏覽器中運行測試,資料將使用 flatted 包進行字串化。
一般原則是,您可以發送幾乎任何東西,但函數、Promise、正則表達式和其他不可序列化的資料除外。v8.stringify
無法序列化 regexp,但您可以發送字串版本,並在 Node.js 進程中自行解析。此外,您可以發送包含循環參考的資料。
此外,在設置 Error properties 之前,請務必先將其序列化。
您也可以在測試完成執行時從 Vitest 狀態獲取此信息:
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 時,也可以擴展類型定義:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}