Метод assertInHTML

Метод assertInHTML применяется к экземпляру класса TestCase и проверяет, содержится ли переданный HTML-фрагмент в полученном ответе от клиента. Этот метод учитывает структуру HTML-документа, игнорируя при этом пробелы, переносы строк и другие незначительные различия в форматировании. В случае отсутствия фрагмента или несовпадения структуры, метод выбрасывает исключение с подробным сообщением об ошибке.

Метод принимает два обязательных аргумента: html - HTML-фрагмент, который нужно найти, и response - объект ответа от клиента. Третий необязательный аргумент msg_prefix позволяет добавить префикс к сообщению об ошибке для лучшей идентификации теста. Метод полезен для проверки наличия конкретных элементов на странице, например, форм, кнопок, заголовков или сообщений об ошибках.

Синтаксис

pythonself.assertInHTML(html, response, msg_prefix=None)

Пример . С проверкой заголовка

Проверим, что страница содержит заголовок первого уровня с текстом "Welcome to Blog":

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

class HomePageTest(TestCase):
  def test_homepage_contains_heading(self):
    response = self.client.get(reverse('home'))
    self.assertInHTML('<h1>Welcome to Blog</h1>', response)

Пример . С проверкой ссылки

Проверим наличие ссылки для перехода на страницу входа с определенными атрибутами:

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

class NavigationTest(TestCase):
  def test_nav_has_login_link(self):
    response = self.client.get(reverse('home'))
    login_link = '<a href="/login/" class="nav-link">Login</a>'
    self.assertInHTML(login_link, response)

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

Проверим наличие формы с определенными полями и кнопкой отправки:

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

class ContactFormTest(TestCase):
  def test_contact_page_has_form(self):
    response = self.client.get(reverse('contact'))
    form_html = '''
      <form method="post" action="/contact/">
        <input type="text" name="name" placeholder="Your name">
        <input type="email" name="email" placeholder="Your email">
        <textarea name="message" placeholder="Your message"></textarea>
        <button type="submit">Send message</button>
      </form>
    '''
    self.assertInHTML(form_html, response)

Пример . С проверкой ошибки валидации

Проверим, что при некорректной отправке формы на странице появляется сообщение об ошибке:

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

class RegistrationTest(TestCase):
  def test_invalid_registration_shows_error(self):
    data = {'username': '', 'password': '123'}
    response = self.client.post(reverse('register'), data)
    error_message = '<ul class="errorlist"><li>This field is required.</li></ul>'
    self.assertInHTML(error_message, response)

Пример . С проверкой в контексте

Проверим, что страница содержит несколько элементов, сгенерированных из контекста шаблона:

pythonfrom django.test import TestCase
from django.urls import reverse
from myapp.models import Article

class ArticleListTest(TestCase):
  @classmethod
  def setUpTestData(cls):
    cls.article1 = Article.objects.create(title='First article')
    cls.article2 = Article.objects.create(title='Second article')

  def test_article_list_contains_articles(self):
    response = self.client.get(reverse('article_list'))
    self.assertInHTML('<li>First article</li>', response)
    self.assertInHTML('<li>Second article</li>', response)

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

  • метод assertContains,
    который проверяет наличие текста в ответе
  • метод assertNotContains,
    который проверяет отсутствие текста в ответе
  • метод assertHTMLEqual,
    который сравнивает два HTML-документа на равенство
  • класс Client,
    который используется для эмуляции запросов в тестах