2017-02-20 17 views
1

У меня возникли проблемы с издевательством функции с модуля сторонних узлов в приложении Redux.Мозаичный модуль узла в промежуточном программном обеспечении Redux (Jest)

Я пытаюсь проверить функцию промежуточного программного обеспечения, которая перехватывает определенное действие и вызывает функцию из стороннего пакета npm. (Модуль АМС-ВГД-устройство 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

мне удалось обойти эту проблему путем объединения предложения Андреаса с факт, что я должен был предоставить правильное действие «формы» в своем тесте.

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

Кажется, издевались функция будет по-прежнему прочитать аргументы, переданные ему, и если есть эталонные ошибки там, то это будет ошибкой.