Макет Axios для проверки .catch () - PullRequest
5 голосов
/ 07 ноября 2019

Я пытался написать тесты, чтобы проверить вызов axios, но теперь мне нужно протестировать часть catch.

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

jest.mock('axios', () => jest.fn(() => Promise.resolve({ data: mockData })));

, но это всегда будет возвращать хороший результат, поэтому не могу проверить улов. Кусок кода, который я хочу проверить: goToUrl() - это просто window.location.assign(url), но импортированный.

fetchBundlesFromApi(params)
  .then(({ data: { bundles } }) => {
    updateBundles(bundles);
    this.setState({ showUpdatingPrices: false });
  })
  .catch(() => goToUrl(bundlesUrl));

В моем тесте для .then() части я делаю это:

const fetchedBundles = await fetchBundlesFromApi(
  '?params',
);
expect(fetchedBundles.data).toEqual(mockData);

Однако, если я последую примеру, подобному этому Mocking Axios с Jest in React - функция mockне вызывается Я не могу вручную смоделировать get, если я помещаю файл фиктивного аксиоса в папку __mocks__, тогда большая часть тестового набора не пройдена, поэтому я просто хочу смоделировать его в этом одном тестовом файле.

вот один из примеров, которые я пытался сделать:

    jest.mock('axios', () => ({
  get: () => jest.fn(() => Promise.resolve({ data: mockData })),
  default: () => jest.fn(() => Promise.resolve({ data: mockData })),
}));

, но ошибка тестов с TypeError: (0 , _axios.default) is not a function

РЕДАКТИРОВАТЬ:

Вот мойФункция fetchBundlesApi:

const fetchBundlesFromApi = params => axios(`${bundleRoute}/bundles${params}`);

РЕДАКТИРОВАТЬ: тест поймать

    it('should redirect if api fails', async () => {
    const networkError = new Error('Some network error');
    axios.mockRejectedValueOnce(networkError);
    const goToUrl = jest.fn();
    let error;

    try {
      await fetchBundlesFromApi('?params');
    } catch (err) {
      error = err;
    }

    expect(error).toEqual(networkError);
    expect(goToUrl).toHaveBeenCalled();
  });

в моем компоненте я импортирую goToUrl, например:

import { goToUrl } from 'Helpers';

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете использовать способность Jests для извлечения реализаций после их запуска, например, mockImplementationOnce и друзей.

import axios from 'axios';

jest.mock('axios');

// default implementation
axios.get.mockResolvedValue(mockedData);

describe('#fetchBundlesFromApi', () => {
  it('returns data from API', async () => {
    const fetchedBundles = await fetchBundlesFromApi('?params');
    expect(fetchedBundles.data).toEqual(mockData);
  });
  it('redirects on failure', () => {
    // override behaviour for this one call
    axios.get.mockRejectedValueOnce();
    // verify your failure test
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...