模拟Axios测试.catch()

sau*_*ers 5 javascript reactjs jestjs axios

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

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

jest.mock('axios', () => jest.fn(() => Promise.resolve({ data: mockData })));
Run Code Online (Sandbox Code Playgroud)

但这总是会返回一个好的结果,因此无法测试捕获。我要测试的代码是:goToUrl()只是一个window.location.assign(url)但导入了。

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

在我的测试中,.then()我这样做:

const fetchedBundles = await fetchBundlesFromApi(
  '?params',
);
expect(fetchedBundles.data).toEqual(mockData);
Run Code Online (Sandbox Code Playgroud)

但是,如果我遵循类似的示例,在React中使用Jestget模拟Axios- 不调用模拟功能,如果将模拟axios文件放在文件夹中,__mocks__则无法手动模拟,那么很多测试失败了,所以我只想模拟它在这个测试文件中。

这是我尝试执行的示例之一:

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

但是测试错误 TypeError: (0 , _axios.default) is not a function

编辑:

这是我的fetchBundlesApi函数:

const fetchBundlesFromApi = params => axios(`${bundleRoute}/bundles${params}`);
Run Code Online (Sandbox Code Playgroud)

编辑:赶上测试

    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();
  });
Run Code Online (Sandbox Code Playgroud)

在我的组件中,我goToUrl像这样导入:

import { goToUrl } from 'Helpers';

Jam*_*mes 5

您可以利用 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
  });
});
Run Code Online (Sandbox Code Playgroud)