Я прочитал массу статей о тестировании саг, но не смог найти решение проблемы, с которой столкнулся, может, кто-то здесь, кто достаточно разбирается в этой теме, может мне помочь?
Извините за плохой английский, это не мой родной язык, я старался изо всех сил.:)
Проблема в том, что при попытке проверить сагу-функцию, которая обрабатывает запрос к серверу с помощью 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
);
});