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)