我很难从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'
}
似乎模拟的函数仍将读取传递给它的参数,如果那里有参考错误,则会错误。