Тестирование типа исключения в Jest: советы и руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для проверки типа выбрасываемого исключения в Jest используйте метод .toThrow(Type). Оберните вызов вашей функции в expect() вот так:

JS
Скопировать код
expect(() => yourFunction()).toThrow(ExpectedError);

Проверьте, что ExpectedError — это класс ожидаемой ошибки. Это утверждение позволит проверить, выбрасывает ли функция yourFunction() исключение указанного класса.

Кинга Идем в IT: пошаговый план для смены профессии

Прогулка по тестированию ошибок с Jest

Магия toThrow

Проверка типов исключений может быть расширена до проверки конкретных сообщений об ошибках. Это обеспечит детальную проверку обработки исключений:

JS
Скопировать код
expect(() => riskyBusiness()).toThrowError(/ожидаемое сообщение об ошибке/);

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

Отлов ошибки в асинхронном коде

При тестировании асинхронного кода используйте синтаксис async/await и конструкцию .rejects для эффективной проверки асинхронных исключений:

JS
Скопировать код
await expect(asyncOperation()).rejects.toThrow(ExpectedAsyncError);

Нам не следует игнорировать необходимость тестирования асинхронных функций, будьте внимательны при обработке типов исключений и отдельных сообщений об ошибках.

Проверка конкретного числа утверждений

Для уверенности, что в тесте было выполнено задуманное число утверждений, используйте expect.assertions(number):

JS
Скопировать код
test('баланс между порядком и хаосом', () => {
  expect.assertions(1);
  
  expect(() => questionableMethod()).toThrow(PredictableError);
});

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

Игра в отлов ошибок с try/catch

Хотя метод toThrow – мощный инструмент для тестирования, иногда требуется более тонкая ручная настройка обработки ошибок. В этой ситуации на помощь придёт блок try/catch, где можно анализировать дополнительные свойства или поведение исключений:

JS
Скопировать код
try {
  possiblyBrokenFunction();
} catch (e) {
  expect(e).toBeInstanceOf(ExpectedFailure);
  expect(e).toHaveProperty('message', 'запланированный хаос');
}

Блок try/catch предоставляет полный контроль над процессом обработки исключений, принося удовлетворение вашему внутреннему перфекционисту.

Визуализация

Тестирование исключений в Jest можно сравнить с высеиванием ошибок из потока операций:

JS
Скопировать код
expect(() => processor.process(faultyItem)).toThrow(SpecificError);

В реальной жизни это можно представить так:

Markdown
Скопировать код
Поток работ: [🔧, 💾, ⚙️, 🦠, 🔗] // Объекты, проходящие через процессор
🦠: Аномалия или ошибка в процессе

🕵️‍♀️ Ошибка: SpecificError / TypeError // Детектив, ищущий конкретные ошибки

Поиски ошибок типа SpecificError будет выглядеть так:

Markdown
Скопировать код
Детектив от Jest: [🕵️‍♀️]  // В поисках SpecificError
Результат: 🟢     // И вот мы обнаружили ожидаемую ошибку SpecificError!

Полезные материалы

  1. Expect · Jest — изучите документацию Jest, чтобы понять, как использовать toThrowError.
  2. instanceof – JavaScript | MDN — углубитесь в оператор instanceof с помощью руководства MDN, который необходим для проверки типов объектов в JavaScript.
  3. An Async Example · Jest — в этом туториале раскрываются секреты тестирования асинхронного кода с помощью Jest.
  4. javascript – How to test the type of a thrown exception in Jest – Stack Overflow — присоединитесь к обсуждению на Stack Overflow, где можно обменяться практическим опытом тестирования исключений в Jest.
  5. Expect · Jest — научитесь создавать настраиваемые проверки для уникальных тестов исключений с помощью Jest.
  6. try...catch – JavaScript | MDN — освойте искусство обработки исключений в JavaScript с помощью конструкции try...catch.
  7. rejects.toThrowError · Issue #3601 · jestjs/jest · GitHub — станьте участником обсуждения на GitHub, где разработчики Jest обмениваются мнениями о возможностях фреймворка для работы с исключениями и промисами.