Метод assertFormError

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

Синтаксис

pythonself.assertFormError(response, form, field, errors, msg_prefix='')

Параметры метода:

Пример . С валидацией обязательного поля

Допустим, у нас есть модель и форма для создания статьи. Проверим, что при отправке пустого поля title возникает соответствующая ошибка:

pythonfrom django.test import TestCase
from django.urls import reverse
from myapp.forms import ArticleForm

class ArticleFormTest(TestCase):
  def test_title_required(self):
    form_data = {'title': '', 'content': 'Some content'}
    form = ArticleForm(data=form_data)
    
    self.assertFalse(form.is_valid())
    self.assertFormError(form, 'title', 'This field is required.')

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

python"Test passed: form validation error detected for title field"

Пример . С проверкой формы в ответе сервера

Часто метод применяется для проверки форм, переданных в контексте ответа после POST-запроса. Рассмотрим тест для регистрации пользователя:

pythonfrom django.test import TestCase
from django.urls import reverse

class RegistrationTest(TestCase):
  def test_invalid_email(self):
    response = self.client.post(reverse('register'), {
      'username': 'john_doe',
      'email': 'invalid-email',
      'password1': 'testpass123',
      'password2': 'testpass123',
    })
    
    self.assertFormError(
      response,
      'form',
      'email',
      'Enter a valid email address.'
    )

Пример . Проверка нескольких ошибок

Метод assertFormError позволяет проверить наличие нескольких ошибок в одном поле или разных полях формы:

pythonfrom django.test import TestCase
from myapp.forms import ArticleForm

class ArticleFormTest(TestCase):
  def test_multiple_errors(self):
    form_data = {
      'title': 'Short',
      'content': '',
    }
    form = ArticleForm(data=form_data)
    
    self.assertFalse(form.is_valid())
    self.assertFormError(form, 'title', 'Title is too short.')
    self.assertFormError(form, 'content', 'This field is required.')

Пример . Проверка общих ошибок формы

Для проверки ошибок, не привязанных к конкретному полю, передайте None в качестве значения параметра field:

pythonfrom django.test import TestCase
from django import forms

class CustomForm(forms.Form):
  password = forms.CharField()
  confirm = forms.CharField()
  
  def clean(self):
    cleaned_data = super().clean()
    password = cleaned_data.get('password')
    confirm = cleaned_data.get('confirm')
    
    if password and confirm and password != confirm:
      raise forms.ValidationError('Passwords do not match.')
    
    return cleaned_data

class CustomFormTest(TestCase):
  def test_password_mismatch(self):
    form = CustomForm(data={
      'password': 'secret123',
      'confirm': 'secret456',
    })
    
    self.assertFalse(form.is_valid())
    self.assertFormError(form, None, 'Passwords do not match.')

Смотрите также

  • метод assertContains,
    который проверяет наличие определённого содержимого в ответе
  • метод assertRedirects,
    который проверяет выполнение редиректа в ответе
  • метод assertRaisesMessage,
    который проверяет возникновение исключения с определённым сообщением
  • класс TestCase,
    который предоставляет основу для написания тестов в Django