2017-02-20 45 views
1

我在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'作爲動作的一部分被傳入。

我在其他地方使用過這種模式,並取得了成功。有誰知道爲什麼這個功能沒有被嘲笑?

回答

2

若要模擬您要導入到要測試的文件中的內容,必須使用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() 
    }) 
}) 
+0

我仍然得到相同的錯誤。好像開玩笑似乎完全無視我嘲笑的功能。 –

+0

你可以在你的組件中記錄'awsIot',檢查它是否被嘲弄。 –

+0

是的,它很奇怪。事實上,如果我擴展你的建議並添加一個模擬實現到'.device',我可以看到在我的原始文件中正確返回。但由於某種原因,下一行(調用完全相同的函數似乎忽略了這一點...) –

0

我設法由Andreas的建議,用相結合來解決這個問題事實上,我必須在測試中提供正確的「形狀」動作。

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

看來嘲笑功能仍會讀傳遞給它的參數,如果有引用錯誤有那麼就會報錯。