Чтобы завершить приложение электронной библиотеки, мы напишем тесты для представлений. Представления будут представлять бизнес-логику нашего приложения. Это означает, что он служит кодом, который получает веб-запрос и отправляет ответ обратно пользователю. Здесь преследуются две цели:
- Во-первых, разрешить форме сохранять новую книгу в базе данных.
- Во-вторых, отображать все книги для пользователей.
В настоящее время у нас есть просто представление в файле views.py, которое отображает пустую форму add_book_form.
Напишите тест для представлений
Давайте напишем несколько тестов для представлений:
from django.test import TestCase, SimpleTestCase
from .models import Catalog
from django.urls import reverse
from django.urls.base import resolve
from .views import home
from .forms import AddBookForm
class CatalogViewTests(TestCase):
""" Тест для представлений """
def test_book_list_view(self):
Book_1 = Catalog.objects.create(
title='Django for Beginners (2018)',
ISBN='978-1-60309-0',
author='John Doe',
price=9.99,
availability='true'
)
Book_2 = Catalog.objects.create(
title='Django for Professionals (2020)',
ISBN='978-1-60309-3',
author='Mary Doe',
price=11.99,
availability='false'
)
response = self.client.get(reverse('home'))
self.assertIn('Django for Professionals (2020)', response.content.decode())
self.assertIn('John Doe', response.content.decode())
self.assertIn('978-1-60309-3', response.content.decode())
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: У нас есть новый тестовый класс под названием
CatalogViewTests, который наследуется от классаTestCase. Это потому, что мы будем взаимодействовать с базой данных.
- Строка 11: Внутри этого тестового класса у нас есть единственный метод с именем
test_book_list_view.
- Строки 13 и 21: Мы создаем две записи данных.
- Строка 29: Цель этого теста — показать, что когда мы запрашиваем домашнюю страницу, мы успешно получаем все книги, отображаемые на домашней странице. Для этого мы запрашиваем домашнюю страницу и сохраняем ее в переменной с именем
response.
Наконец, у нас есть три assertIn функции, которые показывают, присутствуют ли эти книги на нашей домашней странице.
Чтобы получить содержимое нашей response переменной, мы обращаемся к ней, используя response.content.decode().
Запустите тест
После написания теста пришло время его запустить. Напомним, что это второй шаг процесса TDD, и тест должен провалиться. Это показывает, что тест на самом деле тестирует что-то новое.
python manage.py test elibrary_app.tests.CatalogViewTests.test_book_list_view
Мы не добавили функциональность в представления Django. Таким образом, мы получаем проваленный тест.