簡體   English   中英

開玩笑:在使用 `jest.fn()` 保持對模擬 function 的引用時遇到問題

[英]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 檢查。 letconst變量在聲明之前處於臨時死區,在評估工廠時訪問它們會導致未編譯的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM