Как протестировать тип выбрасываемого исключения в Jest
Я работаю с кодом, где мне нужно протестировать тип исключения, выбрасываемого функцией (например, является ли это 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 ответ(ов)
В 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);
});
Вы можете использовать более компактную версию:
expect(() => {
// Блок кода, который должен вызывать ошибку
}).toThrow(TypeError) // Или .toThrow('ожидаемоеСообщениеОбОшибке')
Этот подход позволяет вам удобно проверять, что указанный блок кода выбрасывает ожидаемое исключение.
Вы можете использовать следующий код для тестирования, который проверяет, что метод бросает исключение:
it('должен выбросить исключение', async () => {
await expect(service.methodName('[email protected]', 'unknown')).rejects.toThrow(
HttpException,
);
});
Этот тест ожидает, что метод service.methodName
с заданными аргументами выбросит исключение типа HttpException
. Убедитесь, что ваш метод действительно может выбросить это исключение при указанных условиях, чтобы тест прошел успешно.
Современный 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. Чтобы исправить это, проверьте, что ваше ожидаемое значение соответствует тому, что возвращается при отклонении.
Если вы работаете с Promise
, вы можете использовать следующий код для проверки того, что ваш промис отклоняется с определённым исключением:
await expect(Promise.reject(new HttpException('Сообщение об ошибке', 402)))
.rejects.toThrowError(HttpException);
В этом примере мы используем метод expect
для проверки, что промис отклоняется с помощью rejects
, и затем проверяем, что он выбрасывает ошибку HttpException
. Не забудьте убедиться, что у вас установлены соответствующие зависимости для тестирования, такие как Jest
, если вы используете этот фреймворк.
Инструменты для юнит-тестирования JavaScript в TDD
Как перенаправить на другую веб-страницу?
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub