任務元資料
警告
Vitest 公開了實驗性的私有 API。重大變更可能不會遵循 SemVer,請在使用 Vitest 時固定其版本。
如果您正在開發自訂報告器或使用 Vitest Node.js API,您可能會發現將正在各種情境中執行的測試資料傳遞給您的報告器或自訂 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 程序。若要攔截和處理此任務,您可以利用報告器實作中提供的 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 套件進行字串化
一般規則是,除了函式、承諾、正規表示式(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
}
}