Mock Axios to test .catch()



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

我已经能够通过这样嘲笑axios来做到这一点,但似乎找不到测试捕获的方法。我已经从栈溢出和web中学习了许多不同的例子。

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

然而,如果我遵循这样的例子,在React中使用Jest模拟Axios-没有调用mock函数,我就无法手动模拟get。如果我把一个mock 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';

您可以利用Jests的功能,在实现运行后弹出实现,即mockImplementationOnce和friends。

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