Метод assertRaisesMessage
Метод assertRaisesMessage применяется к экземпляру TestCase и проверяет, что в блоке кода возникает ожидаемое исключение с определенным сообщением. Метод принимает три аргумента: класс ожидаемого исключения, ожидаемое сообщение и вызываемый объект или блок кода. Если исключение не возникает или сообщение не совпадает, тест считается проваленным. Метод удобно использовать для тестирования валидаций и обработки ошибок в моделях и представлениях.
Синтаксис
self.assertRaisesMessage(expected_exception, expected_message, callable, *args, **kwargs)
Где параметры означают следующее:
-
expected_exception- класс исключения, которое должно возникнуть -
expected_message- строка, которая должна содержаться в сообщении исключения -
callable- вызываемый объект или функция, в которой ожидается исключение -
*argsи**kwargs- аргументы, передаваемые в вызываемый объект
Также метод может использоваться в качестве контекстного менеджера:
with self.assertRaisesMessage(ValueError, "Invalid value"):
# код, который должен вызвать ValueError с указанным сообщением
Пример . Проверка исключения в функции
Давайте проверим, что функция divide вызывает исключение ZeroDivisionError с сообщением при делении на ноль:
from django.test import TestCase
class MathTestCase(TestCase):
def test_divide_by_zero(self):
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
return a / b
self.assertRaisesMessage(
ZeroDivisionError,
"Cannot divide by zero",
divide,
10,
0
)
Пример . Проверка исключения в модели
Давайте проверим, что при создании статьи с пустым заголовком возникает исключение с сообщением об ошибке:
from django.test import TestCase
from django.db import IntegrityError
from myapp.models import Article
class ArticleTestCase(TestCase):
def test_empty_title_raises_error(self):
with self.assertRaisesMessage(
IntegrityError,
"NOT NULL constraint failed"
):
Article.objects.create(title="", content="Some content")
Результат выполнения кода:
"IntegrityError: NOT NULL constraint failed"
Пример . Проверка частичного совпадения сообщения
Метод assertRaisesMessage проверяет, что ожидаемое сообщение содержится в сообщении исключения, а не обязательно полностью совпадает с ним:
from django.test import TestCase
class UserTestCase(TestCase):
def test_invalid_email(self):
def validate_email(email):
if "@" not in email:
raise ValueError("Invalid email address: missing @ symbol")
return True
with self.assertRaisesMessage(ValueError, "missing @"):
validate_email("invalid-email")
Результат выполнения кода:
"ValueError: Invalid email address: missing @ symbol"
Пример . Проверка исключения в представлении
Давайте проверим, что при передаче некорректного ID в представление возникает исключение Http404 с нужным сообщением:
from django.test import TestCase
from django.http import Http404
from myapp.views import get_article
class ViewTestCase(TestCase):
def test_article_not_found(self):
with self.assertRaisesMessage(Http404, "Article not found"):
get_article(999)
Смотрите также
-
метод
assertRaisesMessage,
который проверяет исключение с заданным сообщением -
метод
assertContains,
который проверяет наличие содержимого в ответе -
метод
assertRedirects,
который проверяет корректность редиректа -
метод
assertNumQueries,
который проверяет количество запросов к базе данных