В этом шаге мы продолжаем создавать приложение электронной библиотеки, добавляя тесты для URL-адресов нашего приложения Django.
Полный тест для наших URL
Добавим файл test.py новый класс ElibraryURLsTest, в котором мы протестируем URL-адреса для приложения электронной библиотеки:
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
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.assertEqual(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.assertEqual(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')
- Строка 1: Поскольку URL-адреса не требуют взаимодействия с базой данных, мы выбираем
SimpleTestCaseметод.
- Строка 3: мы импортируем
reverseфункцию, которая принимаетviewnameв качестве аргумента. Используетсяviewnameв пути URL. Функцияreverseизвлекает детали URL определенного пути, используяviewname.
- Строка 4: мы также импортируем
resolveфункцию, которая используется для преобразования определенного URL-адреса вviewфункцию. Поэтому он идет по пути аргументации.
- Строка 7: у нас есть тестовый класс,
ElibraryURLsTestкоторый наследуется отSimpleTestCase.
- Строка 10: Первый тестовый метод внутри класса используется для проверки того, что URL-адрес, сопоставленный с домашней страницей, работает. Поэтому мы используем код состояния
200, который показывает успешный запрос.self.client.get()Функция действует как фиктивный веб-браузер и позволяет нам проверять наши представления, выполняя запросы GET и POST. Мы называемviewnameпуть URL-адреса какhome. Это важно помнить при кодировании URL-адреса в маршрутах.
- Строка 14: у нас есть еще один метод тестирования. Его цель — проверить, что корневой URL
/обрабатывается правильной функцией просмотра. При тестированию по определенному URL-адресу Django проверяет, какая функция просмотра сопоставлена с URL-адресом. Затем он выполняет необходимую бизнес-логику и отправляет ответ. Поэтому мы хотим, чтобы функция просмотра была сопоставлена с правильным URL-адресом.
Запускаем тесты
Это второй шаг, связанный с TDD. Давайте запустим тесты, которые мы только что написали, чтобы увидеть, как они терпят неудачу, используя следующую команду:
-
python manage.py test elibrary_app.tests.ElibraryURLsTest.test_homepage_url_name
-
python manage.py test elibrary_app.tests.ElibraryURLsTest.test_root_url_resloves_to_homepage_view
Как и ожидалось, мы получим неудачные тесты, потому что мы еще не написали нашу маршрутизацию для приложения.