在Jest中测试.catch(()块失败

时间:2020-05-01 19:26:52

标签: jestjs vuex

我正在尝试测试是否在给定某个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');
  });

该测试失败,因为它期望eitem(响应),而不是错误。我不确定为什么会这样。

1 个答案:

答案 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'));
  });