5

Как протестировать тип выбрасываемого исключения в Jest

10

Я работаю с кодом, где мне нужно протестировать тип исключения, выбрасываемого функцией (например, является ли это TypeError, ReferenceError и т.д.).

В настоящее время я использую тестовый фреймворк AVA, и я могу проверить это в качестве второго аргумента метода t.throws, как показано ниже:

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  t.is(error.message, 'UNKNOWN ERROR');
});

Однако я начал переписывать свои тесты в Jest и не смог найти, как это сделать легко. Это вообще возможно?

5 ответ(ов)

8

В Jest для проверки того, что функция генерирует ошибку, необходимо передать эту функцию в expect(function).toThrow(<пусто или тип ошибки>).

Вот пример:

test("Описание теста", () => {
  const t = () => {
    throw new TypeError();
  };
  expect(t).toThrow(TypeError);
});

Если вы также хотите проверить сообщение об ошибке, то можно сделать так:

test("Описание теста", () => {
  const t = () => {
    throw new TypeError("UNKNOWN ERROR");
  };
  expect(t).toThrow(TypeError);
  expect(t).toThrow("UNKNOWN ERROR");
});

Если необходимо протестировать существующую функцию, чтобы проверить, выбрасывает ли она ошибку с определенным набором аргументов, нужно завернуть её в анонимную функцию внутри expect().

Вот пример:

test("Описание теста", () => {
  expect(() => { http.get(yourUrl, yourCallbackFn) }).toThrow(TypeError);
});
1

Вы можете использовать более компактную версию:

expect(() => {
  // Блок кода, который должен вызывать ошибку
}).toThrow(TypeError) // Или .toThrow('ожидаемоеСообщениеОбОшибке')

Этот подход позволяет вам удобно проверять, что указанный блок кода выбрасывает ожидаемое исключение.

0

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

it('должен выбросить исключение', async () => {
    await expect(service.methodName('[email protected]', 'unknown')).rejects.toThrow(
      HttpException,
    );
});

Этот тест ожидает, что метод service.methodName с заданными аргументами выбросит исключение типа HttpException. Убедитесь, что ваш метод действительно может выбросить это исключение при указанных условиях, чтобы тест прошел успешно.

0

Современный Jest позволяет производить более детальные проверки на отклоненные значения. Например, вы можете протестировать код статуса HTTP-исключения следующим образом:

const request = Promise.reject({statusCode: 404});
await expect(request).rejects.toMatchObject({ statusCode: 500 });

Этот код не пройдет и вызовет ошибку:

Error: expect(received).rejects.toMatchObject(expected)

- Ожидаемое
+ Полученное

  Объект {
-   "statusCode": 500,
+   "statusCode": 404,
  }

Ошибка происходит из-за того, что мы ожидаем, что отклоненное значение будет содержать код статуса 500, в то время как на самом деле оно содержит код 404. Чтобы исправить это, проверьте, что ваше ожидаемое значение соответствует тому, что возвращается при отклонении.

0

Если вы работаете с Promise, вы можете использовать следующий код для проверки того, что ваш промис отклоняется с определённым исключением:

await expect(Promise.reject(new HttpException('Сообщение об ошибке', 402)))
  .rejects.toThrowError(HttpException);

В этом примере мы используем метод expect для проверки, что промис отклоняется с помощью rejects, и затем проверяем, что он выбрасывает ошибку HttpException. Не забудьте убедиться, что у вас установлены соответствующие зависимости для тестирования, такие как Jest, если вы используете этот фреймворк.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь