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

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

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

Тестирование наших моделей 

Для тестирования нашей модели требуется взаимодействие с базой данных.

Поэтому мы будем использовать класс TestCase вместо класса SimpleTestCase.

Поэтому добавим в файл test.py следующий код:

from django.test import TestCase

from .models import Catalog


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-3: мы импортируем TestCase класс, от которого CatalogModelTests класс будет наследоваться. Мы импортируем Catalog модель. Однако эта модель пока не была создана в нашем models.py файле.
  • Строки 9–16: у нас есть setUp метод, создающий экземпляр  Catalog с определенными данными поля.
  • Строка 18: у нас есть test_create_book метод. Цель состоит в том, чтобы проверить, что новая запись книги, созданная в setUp методе, действительно является экземпляром модели Catalog. Поэтому мы используем assertIsInstance для проверки этого.
  • Строка 21: у нас есть второй тестовый метод с именем test_str_representation. Он проверяет, что строковое представление работает должным образом. Этот метод показывает, что строковое представление будет равно полю title.
  • Строка 24: у нас есть последний тестовый метод под названием test_saving_and_retrieving_book. Он проверяет, можем ли мы как получить, так и сохранить новую книгу в каталоге.
  • Строки 25—31: Создаем и сохраняем книгу в каталоге. Проделываем то же самое с строки 33 по 39.
  • Строки 41 и 42: мы используем assertEqual для проверки успешности сохранения книг.
  • Строки 44–47: мы извлекаем название из первой и автора из второй книги соответственно. Затем мы проверяем, соответствуют ли они соответствующим данным.

 

Запускаем тесты

После написания тестов пришло время их запустить. Это второй шаг процесса TDD, и тесты должны провалиться. Это покажет, что тесты действительно проверяют что-то новое, что еще не реализовано.

Запустите каждый метод тестирования независимо, используя следующие команды:

  • python manage.py test elibrary_app.tests.CatalogModelTests.test_create_book
  • python manage.py test elibrary_app.tests.CatalogModelTests.test_str_representation
  • python manage.py test elibrary_app.tests.CatalogModelTests.test_saving_and_retrieving_book


Мы должны получить неудачные тесты, поскольку мы еще не реализовали эту функцию, написав модель Catalog.


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

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

тут вроде Equal должно быть

@Ilia_Boiarintsev, спасибо, исправил.

@Дмитрий_Селезнев, В 4й странице этой главы - та же ошибка (последняя перед тестами)

@Ilia_Boiarintsev, это тоже исправил,спасибо.