Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

4.5 Написание тестов для форм и шаблонов
4 из 6 шагов пройдено
0 из 6 баллов  получено

Как мы знаем, Django следует модели Model-View-Template. Для наших моделей мы написали и тест, и код. Мы обсудили вид, а также шаблон. Однако мы еще не создали полный набор тестов для шаблона. Этому и будет посвящен данный шаг.

Шаблон этого проекта представляет собой единственный файл с именем index.html, который был подготовлен в предыдущем сеансе. Здесь хранится код, который пользователи просматривают на домашней странице веб-приложения.

Протестируйте шаблон 

Весь тест для нашего шаблона показан ниже. Он также показывает многочисленные методы тестирования, которые мы будем использовать при повторении нашей кодовой базы, чтобы убедиться, что требуемый результат виден на домашней странице:

from django.test import TestCase, SimpleTestCase
from django.urls.base import resolve
from .models import Catalog
from django.urls import reverse
from .views import home
from .forms import AddBookForm

class CatalogTemplateTests(SimpleTestCase):
    """    Тест шаблона    """
    def test_homepage_template(self):
        response = self.client.get(reverse('home'))
        self.assertTemplateUsed(response, 'home.html')

    def test_homepage_contains_correct_html(self):
        response = self.client.get(reverse('home'))
        self.assertContains(response, 'E-library Application')

    def test_homepage_does_not_contain_incorrect_html(self):
        response = self.client.get(reverse('home'))
        self.assertNotContains(response, 'Hello World') 
    

class CatalogFormTests(SimpleTestCase):
    """    Тест форм    """
    def setUp(self):
        url = reverse('home')
        self.response = self.client.get(url)

    def test_book_form(self):
        form = self.response.context.get('add_book_form')
        self.assertIsInstance(form, AddBookForm)
        self.assertContains(self.response, 'csrfmiddlewaretoken')

    def test_bootstrap_class_used_for_default_styling(self):
        form = self.response.context.get('add_book_form')
        self.assertIn('class="form-control"', form.as_p())

    def test_book_form_validation_for_blank_items(self):
        add_book_form = AddBookForm(
            data={'title': '', 'ISBN': '', 'author': '', 'price': '', 'availability': ''}
            )
        self.assertFalse(add_book_form.is_valid())


class ElibraryURLsTest(SimpleTestCase):
    """    Тестируем URLs    """

    def test_homepage_url_name(self):
        response = self.client.get(reverse('home'))
        self.assertEqual(response.status_code, 200)

    def test_root_url_resloves_to_homepage_view(self):
        found = resolve('/')
        self.assertEquals(found.func, home)


class CatalogModelTests(TestCase):
    """    Тест модели каталога    """

    def setUp(self):
        self.book = Catalog(
            title='First Django Book',
            ISBN='978-1-60309-3',
            author='Ilya Perminov',
            price='9.99',
            availability='True'
        )

    def test_create_book(self):
        self.assertIsInstance(self.book, Catalog)

    def test_str_representation(self):
        self.assertEquals(str(self.book), "First Django Book")

    def test_saving_and_retrieving_book(self):
        first_book = Catalog()
        first_book.title = 'First Django Book'
        first_book.ISBN = '978-1-60309-3'
        first_book.author = 'Ilya Perminov'
        first_book.price = '9.99'
        first_book.availability = 'True'
        first_book.save()

        second_book = Catalog()
        second_book.title = 'Second Django Book'
        second_book.ISBN = '978-3-60124-1'
        second_book.author = 'Dmitry Seleznev'
        second_book.price = '19.99'
        second_book.availability = 'False'
        second_book.save()

        saved_books = Catalog.objects.all()
        self.assertEqual(saved_books.count(), 2)

        first_saved_book = saved_books[0]
        second_saved_book = saved_books[1]
        self.assertEqual(first_saved_book.title, 'First Django Book')
        self.assertEqual(second_saved_book.author, 'Dmitry Seleznev')
    

 

  • Строка 9: В файле найден новый класс CatalogTemplateTests, который наследуется от класса . Цель этого класса — проверить наш файл шаблона HTML через SimpleTestCase.
  • Строка 13: Когда мы посещаем домашнюю страницу, test_homepage_template, используется первый метод, чтобы убедиться, что использовался правильный шаблон. Мы используем assertTemplateUsed функцию утверждения. В этом случае вызывается указанный нами шаблон - home.html.
  • Строка 15: test_homepage_contains_correct_html, В этой строке мы видим следующий метод тестирования. Цель этой функции — увидеть, появляется ли фраза 'E-library Application' где-нибудь на главной странице. Поскольку это будет заголовок приложения, его необходимо включить в наш HTML-файл.
  • Строка 19: У нас есть этот тестовый метод для проверки того, что слова Hello World не найдены на домашней странице.

Проведите тесты 

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

  • python manage.py test elibrary_app.tests.CatalogTemplateTests.test_homepage_template
  • python manage.py test elibrary_app.tests.CatalogTemplateTests.test_homepage_contains_correct_html
  • python manage.py test elibrary_app.tests.CatalogTemplateTests.test_homepage_does_not_contain_incorrect_html

Как и ожидалось, мы получаем проваленные тесты. Это означает, что мы делаем успехи, и пришло время написать фактический код для шаблона.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
from .models import CatalogueНаша модель называется Catalog

@Sergei_Aleshin, исправили недавно, у вас в кеше страница просто.

шаблон вроде назвали  index.html  в прошлом шаге.

@Ilia_Boiarintsev, А, понял. Как будто создание файла home.html прошло мимо меня.

Хотя, нет. В итоге добавил E-library Application в шаблон, в тестах исправил  home.html на index.html и убрал Hello World.

@Ilia_Boiarintsev, Шаблон home.html создается в следующем шаге. Основная концепция TDD(разработка через тестирование) в том, что сначала мы пишем тесты, и лишь потом пишем остальное. Немного разберу подробнее этот блок кода:

    def test_homepage_template(self):
        response = self.client.get(reverse('home'))
        self.assertTemplateUsed(response, 'home.html')
# Проверяем, был ли использован шаблон home.html при формировании ответа.

    def test_homepage_contains_correct_html(self):
        response = self.client.get(reverse('home'))
        self.assertContains(response, 'E-library Application')
# Проверяем, содержит ли ответ 'E-library Application'.


    def test_homepage_does_not_contain_incorrect_html(self):
        response = self.client.get(reverse('home'))
        self.assertNotContains(response, 'Hello World') 
# Проверяем, что текст 'Hello World' не содержится в ответе

@Илья_Перминов, все понял. Спасибо

Опечатки: class CatalogueTemplateTests, class CatalogueFormTests и def test_hompage_does_not_contain_incorrect_html

@Григорий_Кожанов, спасибо, исправил.