Метод assertNotContains
Метод assertNotContains применяется к объекту ответа
(например, возвращённому методом client.get)
и проверяет, что содержимое ответа не содержит указанную строку.
Если искомая строка присутствует в ответе, тест падает с ошибкой.
Этот метод удобен для проверки того, что определённые элементы
не отображаются на странице, например, кнопки удаления для
неавторизованных пользователей или сообщения об ошибках,
которые не должны появляться при корректных данных.
Метод имеет два обязательных аргумента:
response - объект ответа сервера, и text -
строка, которую нужно проверить на отсутствие.
Дополнительно можно передать аргумент status_code
для проверки кода ответа (по умолчанию 200) и
аргумент msg_prefix для добавления префикса
к сообщению об ошибке.
Синтаксис
self.assertNotContains(response, text, status_code=200, msg_prefix='')
Пример . Проверка отсутствия строки
Проверим, что страница со списком статей не содержит кнопку удаления для обычного пользователя:
from django.test import TestCase
from django.urls import reverse
from myapp.models import Article
class ArticleListViewTest(TestCase):
@classmethod
def setUpTestData(cls):
cls.article = Article.objects.create(
title='Test Article',
content='Test content'
)
def test_delete_button_not_shown_to_user(self):
response = self.client.get(reverse('article_list'))
self.assertNotContains(response, 'Delete')
В этом примере мы проверяем, что слово "Delete" не отображается на странице списка статей. Если слово присутствует в HTML-коде страницы, тест завершится с ошибкой.
Пример . С проверкой статуса
Проверим, что ответ с кодом 404 не содержит текст
"Article found" и при этом имеет корректный статус:
from django.test import TestCase
from django.urls import reverse
class ArticleDetailViewTest(TestCase):
def test_non_existent_article(self):
response = self.client.get(reverse('article_detail', args=[999]))
self.assertNotContains(
response,
'Article found',
status_code=404
)
Здесь мы проверяем, что страница несуществующей статьи
возвращает статус 404 и при этом не содержит
текст "Article found". Метод сначала проверяет код ответа,
а затем отсутствие строки.
Пример . С префиксом сообщения
Добавим префикс к сообщению об ошибке для лучшей идентификации провалившегося теста:
from django.test import TestCase
from django.urls import reverse
class AdminPanelTest(TestCase):
def setUp(self):
# Создаём обычного пользователя (не админа)
from django.contrib.auth.models import User
self.user = User.objects.create_user(
username='user',
password='pass123'
)
def test_admin_button_not_shown_to_user(self):
self.client.login(username='user', password='pass123')
response = self.client.get(reverse('dashboard'))
self.assertNotContains(
response,
'Admin Panel',
status_code=200,
msg_prefix='Dashboard page: '
)
Если тест провалится, сообщение об ошибке будет начинаться
с "Dashboard page: ", что упростит поиск проблемы
в больших наборах тестов.
Смотрите также
-
метод
assertContains,
который проверяет наличие текста в ответе -
метод
assertTemplateUsed,
который проверяет использование шаблона -
метод
assertTemplateNotUsed,
который проверяет отсутствие использования шаблона -
метод
assertRedirects,
который проверяет перенаправление в ответе