2017-02-01 16 views
1

Я пытаюсь написать тест для создателя action, который отправляет другое действие, определенное в том же файле. Это трудно объяснить, так вот пример:jest redux-thunk test, если отправлено действие одного и того же модуля

// actions/timer.js 

export const onClickButton =() => { 
    return dispatch => { 
    // ... do something 
    dispatch(someAction); 
    dispatch(onTimerStart()); // This is the action creator stated below 
    }; 
}; 

export const onTimerStart =() => { 
    return dispatch => { 
    // ... do something 
    dispatch(someAction); 
    }; 
}; 

Я использую шутку, и я хочу, чтобы убедиться, что onTimerStart действие передается при вызове onClickButton. (В моем настоящем коде эти создатели акции принимают некоторые аргументы и на основе тех, onTimerStart должны или не должны быть посланы)

Я не могу показаться, чтобы выяснить, как издеваются onTimerStart так что я могу проверить, если это называется или нет.

+0

Привет @Bram: У меня также есть похожие проблемы, вы нашли решение своей проблемы? Если да, любезно разделите результат – Mothy

ответ

0
  1. Вы можете создать макет для отправки с помощью jest.fn().

  2. Затем вызовите создателя действия один раз, чтобы получить «thunk» (возвращаемая функция, которая отправляет отправку в качестве аргумента).

  3. С этим вызовите эту возвращенную функцию с вашей ложной отправкой в ​​качестве аргумента.

  4. Вы можете увидеть вызовы для отправки с помощью диспетчера dispatch.mock.calls.

(1) Пробный Функция

const dispatch = jest.fn(); 

(2) (3) Получить преобразователь, и назвать его

const thunk = onClickButton(); 
thunk(dispatch); 

(4) Проверьте вызовы отправка

// indices mean: [the second call] [the first argument of that call] 
dispatch.mock.calls[1][0] 
1

Вместо издевательского onTimerStart() вы можете использовать «redux-mock-store» и утверждать, что ваши ожидаемые действия были отправлены.

Вот пример.

import configureMockStore from 'redux-mock-store'; 
import thunk from 'redux-thunk'; 
import * as timerActions from './actions/timerActions'; 
import * as types from './constants/actionTypes'; 
import { InitialAppState } from './reducers/initialState'; 

const createMockStore = configureMockStore([thunk]); 

describe('timerActions',() => { 

    it('successful call should dispatch someAction',() => { 

     // Arrange. 
     const expectedActions = [ 
      { type: types.someAction}, 
     ]; 

     const store = createMockStore(InitialAppState); 

     // Act. 
     store.dispatch(actions.onClickButton()); 

     // Assert. 
     const dispatchedActions = store.getActions(); 
     expect(dispatchedActions).toEqual(expectedActions); 
    }); 

}); 

Используя этот пример, вам просто нужно добавить в аргументы, которые вы упомянули, и импортировать actionCreators, actionTypes и InitialState от правильного расположения.

Обратите внимание, что этот пример был написан в машинописном тексте.

+0

Привет, NIck, спасибо за пример. Ваш пример работает, если есть одна отправка. Однако, когда есть несколько отправлений, утверждение всегда принимает последнюю отправку, поэтому я пытаюсь выяснить, как тестировать несколько отправлений в одних и тех же действиях. Я не могу чистить почтовый код в комментариях, но чтобы дать вам пример из исходного вопроса, второе действие «onTimerStart» - это отдельная отправка (которая работает), в то время как «onClickButton» имеет две рассылки, а шутки - только вторая. , – andre

+0

@AndriyKulak. Похоже, вы пытаетесь протестировать асинхронные действия. См. Документацию redux для того, как это сделать - http://redux.js.org/docs/recipes/WritingTests.html#async-action-creators – Nick

 Смежные вопросы

  • Нет связанных вопросов^_^