我在Redux應用程序中模仿第三方節點模塊的功能時遇到了問題。Redux中間件中的模擬節點模塊(Jest)
我想測試攔截某個動作並從第三方npm包中調用函數的中間件函數。 (該模塊是AWS-IOT裝置-SDK,函數建立WebSocket連接到AWS的IoT服務)
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()
函數,它正在尋找'accessKey'作爲動作的一部分被傳入。
我在其他地方使用過這種模式,並取得了成功。有誰知道爲什麼這個功能沒有被嘲笑?
我仍然得到相同的錯誤。好像開玩笑似乎完全無視我嘲笑的功能。 –
你可以在你的組件中記錄'awsIot',檢查它是否被嘲弄。 –
是的,它很奇怪。事實上,如果我擴展你的建議並添加一個模擬實現到'.device',我可以看到在我的原始文件中正確返回。但由於某種原因,下一行(調用完全相同的函數似乎忽略了這一點...) –