Данные теста Django сохраняются в нескольких тестах, несмотря на то, что они TestCase - PullRequest
0 голосов
/ 18 сентября 2018

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

from django.test import TestCase, Client, TransactionTestCase
...
class TestPancakeView(TestCase):

    def setUp(self):
        self.client = Client()

        # The Year objects are empty (none here - expected)
        print(Year.objects.all())

        # When I run these Test by itself, these are empty (expected)
        # When I run the whole file, this prints out a number of
        # Pancake objects causing these tests to fail - these objects appear
        # to be persisting from previous tests
        print(Pancake.objects.all())

        # This sets up my mock/test data
        data_setup.basic_setup(self)

        # This now prints out the expected years that data_setup creates
        print(Year.objects.all())

        # This prints all the objects that I should have 
        # But if the whole file is ran - it's printing objects
        # That were created in other tests
        print(Pancake.objects.all())

        [...tests and such...]

data_setup.py - это файл, который просто создает все соответствующие тестовые данные для моих тестов, когда они им нужны.Я использую Factory Boy для создания тестовых данных.

Когда я сам запускаю TestPancakeView - мои тесты проходят, как и ожидалось.

Когда я запускаю весь файл test_views.py, мой TestPancakeView тесты не пройдены.

Если я изменю его на TransactionTestCase - он все равно не будет выполнен, когда я запускаю весь файл.

Я создаю данные теста Pancake следующим образом:

        f.PancakeFactory.create_batch(
            2,
            flavor=blueberry,
            intensity='high'
        )

Никакие другие тесты не демонстрируют такого поведения, все они действуют одинаково, когда я запускаю их по отдельности или когда я запускаю их как часть всего файла.

1 Ответ

0 голосов
/ 19 сентября 2018

Итак, я обнаружил, что причина этого в том, что мой класс Pancake был из другого приложения в проекте Django (который был привязан к другой таблице БД);из-за этого - когда я создавал эти объекты изначально - поскольку они существовали в другой тестовой БД, они сохранялись.

Решение:

Используйте функциональность tearDown для каждого теста.

Каждый тест теперь имеет следующее:

def tearDown(self):
    food.Pancake.objects.all().delete()

Это гарантирует, что мои Pancake объекты удаляются после каждого теста - так что мои тесты по Pancake специально проходят независимо от того, выполняются ли ихсобственный или с остальной частью файла.

...