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