Ожидание ошибки с помощью axios-mock-adapter

#javascript #jestjs #axios #axios-mock-adapter

#javascript #jestjs #axios #axios-mock-adapter

Вопрос:

Я пытаюсь протестировать запрос axios get axios-mock-adapter таким образом, чтобы ошибка выдавалась со статусом, который не равен 200. Однако, когда я выполняю тест (см. api.test.js ), я получаю следующее сообщение:

Ошибка: ожидание (функция).Ошибка toThrowError(не определено)

Ожидалось, что функция выдаст ошибку. Но это ничего не выдало.

Как мне проверить, чтобы убедиться, что выдается ошибка, используя axios-mock-adapter методы using my get и handleResponse ? Спасибо!

api.test.js:

 import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

const handleResponse = (response) => {
  if (response.status !== 200) {
    throw new Error('foo');
  } else {
    return response.data;
  }
};

const get = async (url) => {
  const response = await axios.get(url, {withCredentials: true});
  return handleResponse(response);
};

test('testing that, when making a get request to the appropriate url, an error is thrown '  
     ' when status !== 200', async () => {
  new MockAdapter(axios)
    .onGet('sampleUrl')
    .reply(500, {data: 'payload'});
  const expectedError = async () => {
    await get('sampleUrl');
  };
  expect(expectedError).toThrowError();
});
  

Ответ №1:

Проблема, которую я вижу в вашем коде, заключается в том, что expect().toThrowError() ожидается синхронное исключение, но ваш код фактически отклоняет обещание. Бит, который может сбить с толку, заключается в том, что вы видите throw new Error('foo'); в своем handleResponse . Это вызывает исключение, true. Однако, поскольку этот код вызывается async функцией, это исключение преобразуется в отклонение обещания. Это await get('sampleUrl') приводит не к возникновению синхронного исключения, а к отклонению асинхронного обещания.

Глядя на документацию Jest, мне кажется, что вы должны делать:

 return expect(expectedError()).rejects.toThrowError();
  

Вам нужно вызвать expectedError , потому что это функция, которая возвращает обещание, и вам нужно использовать .rejects для преобразования отклонения в простое исключение, с которым можно протестировать .toThrowError() . Обязательно верните утверждение или await его. В противном случае у вас будет оборванное обещание.

Комментарии:

1. Ты, рок-чувак, уже некоторое время обдумывал это, твое решение сработало как шарм!