【问题标题】:How to mock window.Raven with Jest如何用 Jest 模拟 window.Raven
【发布时间】:2017-05-10 12:46:31
【问题描述】:

我正在对 Redux 应用程序的自定义 Sentry 中间件进行单元测试。选择的测试框架是 Jest。我已经尝试了每一种方法来模拟 window.Raven 并且无法使其正常工作。

window.Raven = {
   isSetup: jest.fn(() => false)
}
...
expect(Raven.isSetup).toHaveBeenCalled()

我错过了什么?我需要改用jest.setMock('raven-js')吗?

【问题讨论】:

  • 我为 Raven 维护了一个 Redux 中间件:raven-for-redux 也许它会有所帮助。如果它不能解决您的用例,我很想了解您要解决的问题。也许你可以在 GitHub 页面上提出问题。

标签: javascript unit-testing jestjs sentry


【解决方案1】:

我维护raven-for-redux,这可能是一个 Raven 中间件或 Redux,这并不奇怪。它包括一个 Jest 测试套件,所以我不得不解决一个类似的问题。我没有模拟 Raven,而是选择使用 Raven.setTransport() 简单地指定自定义传输。这让我在测试中避免了网络调用,但仍然可以准确地测试 Raven 想要做什么。

你可以在这里找到整个测试:https://github.com/captbaritone/raven-for-redux/blob/master/index.test.js

【讨论】:

    【解决方案2】:

    最终不得不是这样,Jest 20 中的 api 更改可能......

    jest.mock('raven-js', () => {
        return { isSetup: jest.fn(() => false) }
    })
    

    【讨论】:

      【解决方案3】:

      你必须像这样模拟导入的模块:

      import Raven from 'raven-js' 
      jest.mock('raven-js', ()=> ({
        isSetup: jest.fn(() => false)
      }))
      
      it('should call raven',()=> {
        //run you code
        expect(Raven.isSetup).toHaveBeenCalled()
      })
      

      【讨论】:

      • 所以这在 beforeEach 块中有效,如果我控制台注销 beforeEach 块中的值,它已经成功模拟它但是当我运行调用代码的测试时,我正在测试它导入'raven- js' 并在真实的 Raven 实例上调用 isSetup ......是不是写完了模拟?我需要模拟导入吗?
      • 所以你在测试中用import raven from 'raven-js' 导入它?
      • 在我测试的代码中,它执行import Raven from 'raven-js'。我将该代码导入到我的测试中。
      • 好的,不过你还是把它导入你的模块然后jest.setMock('raven-js' 是要走的路,会更新我的答案
      • Ahrg,抱歉 jest.mock 原因。
      猜你喜欢
      • 2018-12-25
      • 2021-02-15
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多