我正在尝试测试是否在给定某个API响应的情况下达到了Vuex操作的.catch(()
块,并且该错误返回了错误。已达到catch
,但由于期望实际的API响应而不是我抛出的错误,因此测试失败。
我正在测试的操作是:
getPageItems ({ commit, state, }) {
const page = state.page;
return testApi.fetch(`${pageNumber}`).then((response) => {
try {
isValid(response);
commit('addItemsToList', response);
} catch (error) {
console.error(error);
}
},
export const isValid = (response) => {
response.name ? true : throw new Error('invalid item');
};
我的测试是:
test('errors caught', async () => {
const item = {};
const commit = jest.fn();
const state = {
pageNumber: 2,
};
testApi.fetch.mockRejectedValue(item);
expect.assertions(1);
await getPageItems({ commit, state, }).catch((e) => expect(e).toBe('invalid item');
});
该测试失败,因为它期望e
是item
(响应),而不是错误。我不确定为什么会这样。
答案 0 :(得分:1)
mockApi.get.mockResolvedValue(item)
会实现诺言,不会调用catch
回调。
catch
使getPageItems
无条件地解决并实现了诺言,在catch
之后的另一个getPageItems()
回调将永远不会被调用。它也不会导致bad response
错误。 getPageItems
返回已兑现的承诺并有条件地调用console.error
,这是需要测试的内容。
此测试不会返回承诺,即使已声明拒绝,也将被忽略。 async..await
是正确链接承诺的方法:
test('errors are caught', async () => {
mockApi.get.mockResolvedValue();
jest.spyOn(console, 'error');
await getPageItems({ commit, state });
expect(console.error).toHaveBeenCalledWith('bad response'));
});