Тестирование async функций с ожидаемыми ошибками в Jest
Быстрый ответ
await expect(asyncFunction()).rejects.toThrow('Ой! Хьюстон, у нас проблемы');
Это ваш путеводитель по использованию метода expect().rejects.toThrow()
в Jest для проверки корректности обработки ошибок в асинхронных функциях.
Детально разбираем тестирование асинхронных ошибок
Важно убедиться, что ваши асинхронные функции предсказуемо ведут себя при возникновении ошибок. Синтаксис async/await
позволяет эффективно организовать тесты и достоверно оценивать их результаты.
Стрелочная или асинхронная функция
Отлавливание асинхронных ошибок осуществляется с помощью стрелочной функции или асинхронной функции:
// Заворачиваем в стрелочную функцию
await expect(() => asyncFunction()).rejects.toThrow('Ошибка с ID 42');
// Или используем асинхронную функцию
await expect(asyncFunction).rejects.toThrow('Ошибка с ID 42');
Проверяем тип ошибки
Убедитесь в достоверности тестов: проверяем, генерируется ли обычный Error, или используется специализированный класс ошибок:
// Проверяем генерацию стандартной ошибки
await expect(asyncFunction()).rejects.toBeInstanceOf(Error);
// И еще проверяем генерацию пользовательской ошибки
await expect(asyncFunction()).rejects.toBeInstanceOf(CustomError);
Не ограничивайтесь лишь классификацией ошибок – проверяйте текст сообщения или даже экземпляры ошибок:
// Проверяем текст ошибки с использованием регулярных выражений
await expect(asyncFunction()).rejects.toThrowError(/скрытая смертельная опасность/);
Подсчитываем количество утверждений в тесте
Примените expect.assertions(n)
, где n
означает количество ожидаемых утверждений в тесте. Это позволяет контролировать количество проверок в тесте и избегает утраты нужных утверждений.
test('асинхронная функция генерирует ошибку', async () => {
expect.assertions(1); // контролируем число утверждений
await expect(asyncFunction()).rejects.toBeInstanceOf(CustomError);
});
Без ложных срабатываний
Следите, бывает ли такое, что Промис ошибочно переходит в resolve состояние:
test('промис заканчивает работу с ошибкой', async () => {
await expect(somePromise()).rejects.toThrow(); // У нас нет ожиданий насчет resolve.
});
Визуализация
Можно аналогично представить процесс обработки асинхронных ошибок, как движение по автомагистрали:
| Этапы асинхронного теста | Дорога | Обработка исключений |
|-------------------------|------------|----------------------|
| 🏃♂️ Начало теста | 🛣️ Магистраль | 🚧 Препятствие |
| 🔄 Ожидание асинхронности | 🕒 Затор | 🚔 Контроль |
| 🎯 Проверка исключения | 📍 Финиш | 👮♂️ Досмотр |
Проверяющий двигается к контрольному пункту:
🚗💨 Неуклонно приближается к проверке.
🚧🚔 Настороженности, препятствие (исключение) впереди.
👮♂️📋 Соответствие ожидаемому – тест пройден успешно.
Важно! Необходимо понимать логику работы асинхронного кода и правильное решение ошибок.
Тестирование нескольких ошибок параллельно
Почему останавливаться на одной проверке? Проводите множественные тесты параллельно:
test('множественная проверка исключений', async () => {
await expect(asyncFunction()).rejects.toMatchObject({
name: 'EvilError', // это имя ошибки
message: 'Я неизбежен', // и описание ошибки
});
});
Для более точного сопоставления используйте регулярные выражения:
// Регулярное выражение для поиска текста ошибки
await expect(asyncFunction()).rejects.toThrow(/неизбежен/i);
Взаимодействие с .catch()
без async/await
Предпочитаете работать с promises и .catch()
? Вот подходящий пример:
somePromise()
.then(() => {
throw new Error('Ой! Мы разрешили то, что должны были отклонить');
})
.catch(error => expect(error).toBeInstanceOf(ExpectedError)); // Ловим промисы с помощью `.catch()`
Полезные материалы
- Тестирование асинхронного кода в Jest — подробное руководство по работе с async/await в Jest для тестов асинхронного кода.
- Expect в Jest — описание матчера
.toThrowError()
, используемого для поиска ошибок в тестах. - Матчеры в Jasmine — использование методов Jasmine для ожидания ошибок при вызове функции.
- async function в JavaScript — подробно о асинхронных функциях и их применении в JavaScript.
- Работа с промисами в JavaScript — руководство по обработке ошибок в промисах.
- Async/await — простое введение в синтаксис async/await и работу с промисами.
- Mocha — написание тестов для асинхронного кода с использованием Mocha.