Дразнить функцию внутри действия Redux - PullRequest
0 голосов
/ 20 февраля 2019

Я пишу тесты для моих редукционных действий.В одном из моих сложных действий у меня есть функция, например, aRandomFunction, которую я хочу издеваться.Как мне добавить написать тест, который проверяет функцию, которая используется внутри fetchAction?Спасибо!Вы можете увидеть пример ниже.

import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';

jest.mock('../../api/handleError');
jest.mock('../../api/handleResponse');

let store;

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);

beforeEach(() => {
  store = mockStore({});
  fetchMock.restore();
});

const aRandomAction = () => ({
  type: "RANDOM_ACTION",
})

const aRandomFunction = (data, dispatch) => {
  if (data.isTrue) {
    dispatch(aRandomAction);
  }
};

export const fetchAction = () => {
  return (dispatch) => {
    dispatch(requestAction());
    return fetch('sampleApi/foo')
      .then(response => handleResponse(response))
      .then((json) => {
        aRandomFunction(json.data, dispatch);
        dispatch(receiveAction(json.data));
      })
      .catch(error => handleError(error));
  };
};

describe('testing the fetch Action', () => {
  test('testing the fetch action', () => {
    const expectedActions = [
      { type: "REQUEST_ACTION" },
      { type: "RECEIVE_ACTION", data: "payload" },
    ];
    return store.dispatch(fetchAction()).then(() => {
      expect(store.getActions()).toEqual(expectedActions);
    });
  });
});

1 Ответ

0 голосов
/ 21 февраля 2019

В этом случае нельзя смоделировать aRandomFunction, потому что он не экспортируется.Хотя это явно не указано в документации Jest , обратите внимание на в примерах , что только импортируемый код может быть подделан с помощью Jest.Вы можете сосредоточиться на тестировании окончательного результата fetchAction, и то, что происходит посередине, не имеет значения.Совершенно нормально не проверять его, потому что это детали реализации, то есть он определяет только средства, используемые fetchAction для достижения своей цели, которые могут со временем измениться и сломать ваши тесты, даже если цель fetchAction продолжает оставатьсяправильно достигнуто.

Но если для вас важно иметь возможность проверить aRandomFunction, вам придется переместить его во внешний файл и экспортировать оттуда.После этого вы сможете имитировать его так же, как и другие зависимости, такие как handleError и handleResponse.Вы даже можете определить фиктивную реализацию , если это необходимо для вашего тестового примера, например:

random-function.js

const aRandomAction = () => ({
  type: "RANDOM_ACTION",
});

const aRandomFunction = (data, dispatch) => {
  if (data.isTrue) {
    dispatch(aRandomAction());
  }
}

export default aRandomFunction;

ваш-тест-кейс.spec.js (поместите это вместе с вашим тестовым примером из примера в вопросе)

import aRandomFunction from "./random-function";

jest.mock("./random-function");

aRandomFunction.mockImplementation((data, dispatch) => {
  dispatch({ type: "MOCK_ACTION" );
});

...