Django Unit Test - идентификаторы созданных объектов - PullRequest
2 голосов
/ 04 октября 2019

Образец models.py

models.py

class Food(models.Model):
    name = models.CharField(max_length=50, verbose_name='Food')

    def __str__(self):
        return self.name

Предположим, , что я написал модульный тест/ s:

from django.test import TestCase
from myapp.models import Food

class TestWhateverFunctions(TestCase):
    """
    This class contains tests for whatever functions.
    """

    def setUp(self):
        """
        This method runs before the execution of each test case.
        """
        Food.objects.create(name='Pizza') # Will the created object have id of 1?
        Food.objects.create(name='Pasta') # Will the created object have id of 2?

    def test_if_food_is_pizza(self):
        """
        Test if the given food is pizza.
        """
        food = Food.objects.get(id=1)

        self.assertEqual(food.name, 'Pizza')

    def test_if_food_is_pasta(self):
        """
        Test if the given food is pasta.
        """
        food = Food.objects.get(id=2)

        self.assertEqual(food.name, 'Pasta')

Интересно, можно ли предположить, что идентификаторы созданных объектов в методе setUp () всегда будут начинаться с id 1 и т. д. и т. д. вперед? Если нет, есть ли конкретная причина, по которой, если база данных тестов всегда уничтожается после выполнения всех тестов?

1 Ответ

2 голосов
/ 04 октября 2019

Это НЕ безопасно предположить, что. У них могут быть более высокие идентификаторы, если другие тесты выполнялись заранее и создали Food строки, а модульные тесты не выполняются в каком-либо гарантированном порядке.

Сохраните ссылки на экземпляры модели в настройке класса теста:

class TestWhateverFunctions(TestCase):

    def setUp(self):
        self.food1 = Food.objects.create(name='Pizza')
        self.food2 = Food.objects.create(name='Pasta')
...