Проверка ожидаемой ошибки в Jasmine: как использовать toThrow
Быстрый ответ
Для быстрой проверки срабатывания ошибки в Jasmine воспользуйтесь методом toThrowError()
, соединённым с expect
. В качестве аргумента передавайте стрелочную функцию, обернутую вокруг функции, которую вы тестируете:
expect(() => myFunctionThatShouldThrow()).toThrowError();
Таким образом, вы удостоверитесь в том, что функция myFunctionThatShouldThrow
действительно генерирует исключение. Можно передать в .toThrowError()
определённый класс ошибки или текст сообщения для тестирования конкретной ситуации.
Сути глубже: Тестирование конкретных исключений
В более сложных тестах вы можете использовать следующие подходы для проверки ошибок:
1. Проверка конкретных сообщений об ошибках
Чтобы протестировать конкретные сообщения об ошибках, используйте такую конструкцию:
expect(() => myFunction()).toThrowError("Конкретное сообщение об ошибке");
2. Ожидание конкретного класса ошибок
Если вам важен класс исключения, например, TypeError
или RangeError
, используйте toThrowErrorOfType
:
expect(() => myFunction()).toThrowErrorOfType('TypeError');
3. Продвинутое тестирование ошибок при помощи Jasmine Matchers
Когда тестам требуется дополнительная гибкость, Jasmine-Matchers могут предложить расширенные возможности:
expect(() => myFunction()).toThrowAnyError();
4. Индивидуализация ожиданий при помощи пользовательских matchers
Jasmine позволяет создавать пользовательские matchers для учета индивидуальных условий тестирования.
Управление контекстом: Помощник bind
в ES5
Когда в функцию необходимо передать конкретный контекст или аргументы, bind
обретает огромную полезность:
expect(myFunction.bind(context, arg1, arg2)).toThrowError();
Тонкие нюансы на пути к усовершенствованию
1. Стабильные тесты: Проверяем классы исключений вместо сообщений
Важно проверять класс исключения, а не фокусироваться на тексте сообщений об ошибках. Это позволяет избежать влияния возможных изменений текста сообщений на стабильность тестов.
2. Особенности синтаксиса: ES5 против ES6
Разбираться в синтаксических нюансах тестируемых функций крайне важно, так как для ES5 и ES6 они могут отличаться.
Визуализация
Пример кода в качестве иллюстрации "сюрприза в коробке":
describe("тест на срабатывание ошибки", function() {
it("ожидает, что будет выброшена 'Ошибка'", function() {
expect(function() {
throw new Error("Сюрприз!");
}).toThrowError("Сюрприз!");
});
});
📦 До: Закрытая коробка (без ошибки)
🤡 После: Кукла выскочила! (Ошибка сработала, как и ожидалось)
Тут ошибка — это нежелательный сюрприз, который мы успешно предсказали и ‘поймали’.
Лучшие практики: Путь к мастерству
1. Тестируем правильную функцию
Убедитесь, что ваш тест настроен на конкретную функцию, которую нужно проверить:
expect(() => incorrectFunction()).not.toThrowError(); // Здесь ошибок быть не должно
expect(() => correctFunction()).toThrowError(); // Здесь ожидаем ошибку
2. Строки и сообщения об ошибках: Гармоничное сочетание
Не забывайте использовать строки для формирования конкретных сообщений об ошибках в toThrowError
.
3. Тонкости в деталях: Подготовка вызова функции
Как перед важным событием, функцию следует подготовить к вызову:
let boundFunction = myFunction.bind(context, arg1, arg2); // Подготавливаем функцию
expect(boundFunction).toThrowError(); // Проверяем наличие ошибки
Полезные материалы
- Начало работы с Jasmine — основы тестирования с использованием Jasmine.
- Ваш первый набор тестов — гид по созданию тестов на исключения в Jasmine.
- Как создать тест, который ожидает срабатывания ошибки в Jasmine? — практические советы по тестированию ошибок на Stack Overflow.
- Пространство имён: matchers — обзор Jasmine matchers и работы с функцией
expect
. - Ошибка – JavaScript | MDN — подробно о классе ошибок в JavaScript.
- Использование промисов – JavaScript | MDN — азы работы с ошибками в асинхронном коде на примере промисов.