[英]Jest: having trouble keeping a reference of a mock function with `jest.fn()`
我想模擬一個 function 並確保它已經執行了一定次數。 棘手的部分是我想模擬的 function 是另一個 function 返回結果的一部分我的實現大致是這樣的
const theFnIWantedToMock = jest.fn()
jest.mock('../hooks', () => {
const actualHooks = jest.requireActual('../hooks')
return {
...actualHooks,
someHooks() {
return
{
theFnIWantedToMock,
}
}
}
})
describe('test', () => {
it('some test', () => {
//...
expect(theFnIWantedToMock).toHaveBeenCalledTimes(1)
})
})
但是 Jest 拋出一個錯誤,說Invalid variable access theHookINeedToMock
。 有誰知道這樣做的正確方法是什么?
文檔中描述了此問題:,
factory 參數的一個限制是,由於對 jest.mock() 的調用被提升到文件的頂部,因此不可能先定義變量然后在工廠中使用它。 以“mock”開頭的變量例外。 由你來保證它們將按時初始化,例如,由於在變量聲明中使用'fake'而不是'mock',以下將引發超出范圍的錯誤
使用mock
為變量添加前綴會禁用 Jest 檢查。 let
或const
變量在聲明之前處於臨時死區,在評估工廠時訪問它們會導致未編譯的 ES6 中的運行時錯誤。 對於熱切評估的模擬模塊,需要在工廠內定義模擬。
避免這種情況的一種方法是使用提升的var
聲明並在工廠內對其進行初始化:
var theFnIWantedToMock
jest.mock('../hooks', () => {
const actualHooks = jest.requireActual('../hooks')
theFnIWantedToMock = jest.fn()
return {
...actualHooks,
someHooks: jest.fn().mockReturnValue(theFnIWantedToMock),
}
})
保留對它的引用的一種方法是將其保留為導入的一部分:
jest.mock('../hooks', () => {
const actualHooks = jest.requireActual('../hooks')
const theFnIWantedToMock = jest.fn()
return {
...actualHooks,
theFnIWantedToMock,
someHooks: jest.fn().mockReturnValue(theFnIWantedToMock),
}
})
這使得theFnIWantedToMock
作為 import object 的一部分可用,也適用於__mocks__
中的可重用模擬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.