Как протестировать действие, которое отправляется несколько раз?

#unit-testing #redux #react-redux #jestjs #enzyme

#модульное тестирование #сокращение #реагировать-redux #jestjs #фермент

Вопрос:

Описание: Мое действие имеет несколько отправлений. При тестировании этого действия в «шутку» оно указывает на каждую отправку.

Код действия, например.:

 const export myAction = () => (dispatch) => {
  dispatch({payload: {data1: 'Data - 1'}, type: 'UPDATE_DATA_1'});
  dispatch({payload: {data2: 'Data - 2'}, type: 'UPDATE_DATA_2'});
  dispatch({payload: {data3: 'Data - 3'}, type: 'UPDATE_DATA_3'});
}
  

Тестовый код, например.:

 it('myAction()', () => {
  const mockDispatch = jest.fn();
  const expected = {payload: {data3: 'Data - 3'}, type: 'UPDATE_DATA_3'};
  
  myAction()(mockDispatch);
  expect(mockDispatch).toHaveBeenCalledWith(expected);
});
  

Проблема: Поскольку отправка вызывается 3 раза, она завершается неудачей, если я пытаюсь протестировать конкретное.

Запрос: Как протестировать отдельную отправку или как протестировать три из них одновременно?

Ответ №1:

Более простым способом подтверждения последней отправки было бы использовать .toHaveBeenLastCalledWith()

 it('last dispatch is data3 payload, when myAction() is invoked', () => {
  const mockDispatch = jest.fn();
  
  myAction()(mockDispatch);

  expect(mockDispatch).toHaveBeenLastCalledWith({
    payload: {data3: 'Data - 3'}, 
    type: 'UPDATE_DATA_3'
  });
});
  

Или, если вы хотите проверить все 3 отправки, используйте .toHaveBeenNthCalledWith():

 it('dispatch all 3 payloads, when myAction() is invoked', () => {
  const mockDispatch = jest.fn();
  
  myAction()(mockDispatch);

  expect(mockDispatch).toHaveBeenNthCalledWith(1, {
    payload: {data1: 'Data - 1'}, 
    type: 'UPDATE_DATA_1'
  });
  expect(mockDispatch).toHaveBeenNthCalledWith(2, {
    payload: {data2: 'Data - 2'}, 
    type: 'UPDATE_DATA_2'
  });
  expect(mockDispatch).toHaveBeenNthCalledWith(3, {
    payload: {data3: 'Data - 3'}, 
    type: 'UPDATE_DATA_3'
  });
});
  

Комментарии:

1. Спасибо за ваш ответ. Могу ли я использовать его для проверки конкретной n-й функции на предмет того, была она вызвана или нет, независимо от передачи какого-либо аргумента? Я протестировал, и это работает, но хотел знать, правильный ли это способ.

2. Вы могли бы использовать .toHaveBeenCalledTimes(number) для проверки, вызывалась ли функция указанное количество раз, независимо от переданных аргументов. Подробная информация

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

Ответ №2:

Я нашел то, что хотел

 it('myAction()', () => {
  const mockDispatch = jest.fn();
  const expected = {payload: {data3: 'Data - 3'}, type: 'UPDATE_DATA_3'};
  
  myAction()(mockDispatch);
  expect(mockDispatch.mock.calls[2][0]).toEqual(expected);
});