我一直在尝试编写测试以测试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';
答案 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
});
});