Redux中间件中的模拟节点模块(Jest)



我很难从redux应用中的第三方节点模块嘲笑一个函数。

我正在尝试测试拦截某个操作并从第三方NPM软件包调用功能的中间件功能。(该模块是AWS-iot-Device-SDK,该功能建立了与AWS IoT服务的WebSocket连接)

import awsIot from 'aws-iot-device-sdk'
// ...
const customMW = (store => {
  let websocket = null
  return next => action => {
    switch(action.type) {
      case 'CONNECT':
      websocket = awsIot.device({
        accessKeyId: action.accessKey
        // other params...
      })
      // Listen to events etc.
      break
      // ...
    }
  }
})

awsIot.device()建立Websocket连接,并且效果很好。

但是,当我尝试测试customMW函数时,即使我试图嘲笑它,也会调用awsIot.device()(商店和下一个是正确模拟的):

test.js
describe('middleware test', () => {
  it('does something', () => {
    awsIot.device = jest.fn()
    action = { type: 'CONNECT' }
    customMW(store)(next)(action)
    // assertions...
  })
})

运行测试时,我会发现" AccessKey"不确定的错误。因此,中间件正在运行原始的awsIot.device()函数,该功能正在寻找作为操作的一部分传递的"访问"功能。

我在其他地方成功地使用了这种模式。有人知道为什么没有嘲笑这个功能吗?

模拟要在要测试的文件中导入的内容,必须使用jest.mock。这将在进口模块实际导入之前覆盖它。如果您想检查awsIot.device是否在您的测试中调用,则必须在测试中导入模块,然后使用这样的期望:

import awsIot from 'aws-iot-device-sdk'//only needed if you wanna test that device method was called
jest.mock('aws-iot-device-sdk', ()=>({
  device: jest.fn()
}))
describe('middleware test', () => {
  it('does something', () => {
    action = { type: 'CONNECT' }
    customMW(store)(next)(action)
    expect(awsIot.device).toHaveBeenCalled()
  })
})

我通过将安德烈亚斯(Andreas)的建议与我必须在测试中提供正确的'形状'动作相结合来解决这个问题。

action = {
  type: 'CONNECT',
  accessKeyId: 'testKey'
}

似乎模拟的函数仍将读取传递给它的参数,如果那里有参考错误,则会错误。

最新更新