Тест для блока .catch (() не пройден в Jest - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь проверить, достигнут ли блок действия .catch(() действия Vuex при определенном ответе API, и что он возвращает ошибку. 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 (ответ), а не ошибка. Я не уверен, почему это так.

1 Ответ

1 голос
/ 01 мая 2020

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