【问题标题】:Jest, mocking ES6 class constructor not working as intended开玩笑,模拟 ES6 类构造函数没有按预期工作
【发布时间】:2021-09-03 15:41:57
【问题描述】:

我有代码要尝试用 Jest 进行测试。我有一个 ES6 类,我们称之为ClassA。在我的测试文件中,我正在模拟 ClassA 如下:

const mockGetCheapestProductAllPages = jest.fn()
const ClassA = require('../src/ClassA/ClassA')
jest.mock('../src/ClassA/ClassA', () => {
  return jest.fn().mockImplementation(() => {
    return { getCheapestProductAllPages: mockGetCheapestProductAllPages }
  })
})

这种语法对于模拟类非常有效。我可以很好地监视getCheapestProductAllPages,并从中模拟返回值等。问题是,由于某种原因,我无法监视构造函数。在Jest documentation on mocking ES6 classes 中,暗示您可以只引用导入的类来监视构造函数,如下所示:

expect(ClassA).toHaveBeenCalled()

不幸的是,这对我不起作用。我知道在我的测试中调用了构造函数,但 Jest 告诉我它被调用了 0 次。有什么建议/看起来有什么问题吗?尝试仅共享相关代码,但如果您还需要查看其他内容,请告诉我。谢谢!

【问题讨论】:

    标签: javascript jestjs mocking


    【解决方案1】:

    最终在我的模拟之外声明我的 Jest mockImplementation 并在我的测试中引用它,如下所示:

    // top of test file
    const mockGetCheapestProductAllPages = jest.fn()
    const mockClassAImplementation = jest.fn().mockImplementation(() => {
      return { getCheapestProductAllPages: mockGetCheapestProductAllPages }
    })
    const ClassA = require('../src/ClassA/ClassA')
    jest.mock('../src/ClassA/ClassA', () => {
      return mockClassAImplementation
    })
    
    // tests
    test('Expect ClassA constructor to be called', () => {
      // invoke method that invokes ClassA constructor
      // this works!
      expect(mockClassAImplementation).toHaveBeenCalled()
    })
    

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 2018-11-13
      • 2021-02-25
      • 1970-01-01
      • 2020-07-09
      • 2018-08-17
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多