模拟Axios测试.catch()

时间:2019-11-07 11:33:01

标签: javascript reactjs jestjs axios

我一直在尝试编写测试以测试axios调用,但现在需要测试catch部分。

我已经能够通过像这样模拟axios来做到这一点,但似乎无法找到一种方法来测试捕获。我遵循了堆栈溢出和网络中的许多不同示例。

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 with Jest in React - mock function not being called,则无法手动模拟get,如果我将模拟axios文件放在文件夹__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 个答案:

答案 0 :(得分:1)

一旦他们运行了mockImplementationOnce和朋友,您就可以利用Jests的功能将实现弹出。

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
  });
});