Django setUpTestData не выполняет глубокое копирование связанных файлов

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

Однако, от одного теста к другому, содержимое файла не обновляется, это имеет побочные эффекты между моими тестами

вот минималистский пример :

models.py

from django.db import models


class MyModel(models.Model):
    my_file = models.FileField(upload_to="tests/")

test.py

from django.core.files.base import ContentFile
from django.test import TestCase

from core.models import MyModel


class Test(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.instance = MyModel()
        cls.instance.my_file.save("file.txt", ContentFile("Hello from setUpTestData"))

    def test_a(self):
        with open(self.instance.my_file.path, "r") as fp:
            self.assertEqual(fp.read(), "Hello from setUpTestData")
        self.instance.my_file.save("file.txt", ContentFile("Modified data"))

    def test_b(self):
        with open(self.instance.my_file.path, "r") as fp:
            self.assertEqual(fp.read(), "Hello from setUpTestData")
        self.instance.my_file.save("file.txt", ContentFile("Modified data"))

Запуск любого из двух тестов по отдельности работает, однако запуск одного после другого не работает:

AssertionError: 'Modified datatUpTestData' != 'Hello from setUpTestData'
- Modified datatUpTestData
+ Hello from setUpTestData

Как убедиться, что файл правильно сброшен? Меня беспокоят эти строки из документации ?

Объекты, назначенные атрибутам класса в setUpTestData(), должны поддерживать создание глубоких копий с помощью copy.deepcopy()

Мне кажется, что fileField должен обрабатываться Django по умолчанию, но это не работает, что мне делать? Должен ли я попытаться переопределить __deepcopy__ для своих моделей? Модификация моего кода для целей тестирования - это плохая модель.

Я нашел решение, используя setUp и tearDown

def setUp(self) : # copy original files
    shutil.copytree(settings.MEDIA_ROOT, "/tmp/tests", dirs_exist_ok=True)

def tearDown(self) : # restore original files
    shutil.copytree("/tmp/tests", settings.MEDIA_ROOT, dirs_exist_ok=True)
Вернуться на верх