Как утверждать об ошибке, используя axios и async / await - PullRequest
7 голосов
/ 31 мая 2019

Я пытаюсь написать тест, который утверждает, что определенный тип ошибки генерируется с помощью Async / Await и axios.Однако когда я запускаю тест, я получаю следующее.Почему шутка не отвергает мое обещание?Спасибо!

Ошибка: ожидается (получено) .rejects.toThrow ()

Ожидается получение Обещание отклонить, вместо этого оно разрешено до значения
{"data": "response"," status ": 404}

api.js:

import axios from 'axios';
import SpecialError from './specialError.js';

const get = async () => {
  try {
    const response = await axios.get('sampleUrl', { withCredentials: true });
    return response;
  } catch (error) {
    throw new SpecialError(error);
  }
};

export default get;

specialError.js:

export default class SpecialError extends Error {
  constructor() {
    super();
    this.isSpecialError = true;
  }
}

api.test.js:

import axios from 'axios';
import get from './api';
import SpecialError from './specialError.js';

test('testing the api get method', async () => {
  axios.get.mockImplementation(() => Promise.resolve({
    data: 'response',
    status: 404,
  }));

  const expectedError = new SpecialError('foo');

  await expect(get()).rejects.toEqual(expectedError);
});

1 Ответ

4 голосов
/ 31 мая 2019

axios.get используется для разрешения объекта, поэтому get разрешается для этого объекта.

Похоже, что вы тестируете случай ошибки, и в этом случае axios.get должен быть поддельным, чтобы отклонить:

import axios from 'axios';
import get from './code';

test('testing the api get method', async () => {
  jest.spyOn(axios, 'get').mockRejectedValue(new Error('error'));
  await expect(get()).rejects.toThrow('error');  // Success!
});

Обновление

OP обновил вопрос, чтобы спросить, как проверить наличие определенного типа ошибки.

Вы, вероятно, захотите выдать ошибку следующим образом:

try {
  // ...
} catch (error) {
  throw new SpecialError(error.message);  // <= just use the error message
}

... и SpecialError, вероятно, должны передать свои аргументы super следующим образом:

export default class SpecialError extends Error {
  constructor(...args) {
    super(...args);  // <= pass args to super
    this.isSpecialError = true;
  }
}

... но с учетом этих изменений вы можете протестировать так:

import axios from 'axios';
import get from './api';
import SpecialError from './specialError.js';

test('testing the api get method', async () => {
  jest.spyOn(axios, 'get').mockRejectedValue(new Error('the error'));
  const promise = get();
  await expect(promise).rejects.toThrow(SpecialError);  // <= throws a SpecialError...
  await expect(promise).rejects.toThrow('the error');  // <= ...with the correct message
});

Обратите внимание, что тестирование для определенного типа ошибки и является немного сложным делом, поскольку toThrow позволяет проверять одно или другое, но не оба одновременно. Вы можете обойти это ограничение, протестировав каждую из них в отдельности.

...