2017-02-20 3 views
1

Reduxアプリケーションのサードパーティノードモジュールから関数を嘲笑するのに問題があります。Reduxミドルウェア(Jest)のノードモジュールをモックする

特定のアクションをインターセプトし、サードパーティのnpmパッケージから関数を呼び出すミドルウェア関数をテストしようとしています。 (モジュールは、AWS-IOTデバイス-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'が定義されていないというエラーです。したがって、ミドルウェアは、アクションの一部として渡される 'accessKey'を探している元のawsIot.device()関数を実行しています。

私はこのパターンを他の場所で成功させました。誰もがこの機能が嘲笑されていない理由を知っていますか?

答えて

2

テストするファイルにインポートするものを模倣するには、jest.mockを使用する必要があります。インポートされたモジュールは、実際にインポートされる前に上書きされます。私がAndreasの提案を組み合わせることにより、これを回避するために管理

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

を:あなたはawsIot.deviceは、あなたがこのように期待にもテストし、使用中のモジュールをインポートする必要がテスト中に呼び出されたことを確認したい場合私のテストで正しい「形」のアクションを供給しなければならなかったという事実。

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

mocked関数は渡された引数を読み込み、参照エラーがあるとエラーになります。

関連する問題