Аксиоса не высмеивают, пока он бежит от саги - PullRequest
0 голосов
/ 22 сентября 2019

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

Извините за плохой английский, это не мой родной язык, я старался изо всех сил.:)

Проблема в том, что при попытке проверить сагу-функцию, которая обрабатывает запрос к серверу с помощью axios.Я смоделировал модуль axios в папке mock с помощью Promise, поэтому он всегда будет успешно разрешен, но при обращении к axios из саги он разрешается как неудачный запрос, поэтому моя сага всегда выбрасывает действие из блока 'catch'.

Реальный код запроса API:

export const fetchAddressList = address =>
  axios.post("http://localhost:4000/addresses", { geocode: address });

Модуль с поддельными аксиосами в папке mock :

export default {
  post: jest.fn(() => Promise.resolve({ data: { result: [] } }))
};

Сага, которую я тестирую:

export function* fetchAddressListSaga(action) {
  try {
    // this function returns an axios request promise
    const { data } = yield fetchAddressList(action.addressValue);
    yield put(fetchAddressListSuccess(data));
  } catch (e) {
    yield put(fetchAddressListFail());
  }
}

Мой набор тестов:

it("should dispatch ADDRESS_LIST_FETCH_SUCCESS action when API call succeeds", async () => {
  mockAxios.post.mockImplementationOnce(() =>
    Promise.resolve({
      data: "my custom response"
    })
  );

  const response = await geocoderApi.fetchAddressList();
  // logs response, passed with promise to mockImplementationOnce
  // which means that the imported axios module is mocked
  console.log(response);

  const requestSaga = fetchAddressListSaga(action);

  requestSaga.next();

  const requestSagaResult = requestSaga.next().value;

  expect(requestSagaResult.payload.action.type).toEqual(
    actionTypes.ADDRESS_LIST_FETCH_SUCCESS
  );
});
...