Django setUpTestData 没有deepcopy相关文件

Django setUpTestData does not deepcopy related files

我想使用 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

如何确保文件被正确重置?我是否关注文档中的这些行?

Objects assigned to class attributes in setUpTestData() must support creating deep copies with 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)