Метод assertRaisesMessage

Метод assertRaisesMessage применяется к экземпляру TestCase и проверяет, что в блоке кода возникает ожидаемое исключение с определенным сообщением. Метод принимает три аргумента: класс ожидаемого исключения, ожидаемое сообщение и вызываемый объект или блок кода. Если исключение не возникает или сообщение не совпадает, тест считается проваленным. Метод удобно использовать для тестирования валидаций и обработки ошибок в моделях и представлениях.

Синтаксис

pythonself.assertRaisesMessage(expected_exception, expected_message, callable, *args, **kwargs)

Где параметры означают следующее:

Также метод может использоваться в качестве контекстного менеджера:

pythonwith self.assertRaisesMessage(ValueError, "Invalid value"):
  # код, который должен вызвать ValueError с указанным сообщением

Пример . Проверка исключения в функции

Давайте проверим, что функция divide вызывает исключение ZeroDivisionError с сообщением при делении на ноль:

pythonfrom 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
    )

Пример . Проверка исключения в модели

Давайте проверим, что при создании статьи с пустым заголовком возникает исключение с сообщением об ошибке:

pythonfrom 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")

Результат выполнения кода:

python"IntegrityError: NOT NULL constraint failed"

Пример . Проверка частичного совпадения сообщения

Метод assertRaisesMessage проверяет, что ожидаемое сообщение содержится в сообщении исключения, а не обязательно полностью совпадает с ним:

pythonfrom 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")

Результат выполнения кода:

python"ValueError: Invalid email address: missing @ symbol"

Пример . Проверка исключения в представлении

Давайте проверим, что при передаче некорректного ID в представление возникает исключение Http404 с нужным сообщением:

pythonfrom 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,
    который проверяет количество запросов к базе данных