django - 如何在单元测试中优雅地交换(修补)Django FileSystemStorage 设置?

标签 django unit-testing settings storage patch

我遇到了以下问题。我有一个看起来有点像这样的模型:

class Package(models.Model):
    name = models.CharField(max_length=64)
    file = models.FileField(upload_to="subdir",
                            storage=settings.PACKAGE_STORAGE,
                            null=True)

此示例中的基本内容是 FileField 构造函数的 storage= 参数。它填充了来自 settings.py 的值。其中有以下代码:

from django.core.files.storage import FileSystemStorage
PACKAGE_STORAGE = FileSystemStorage(location="/var/data", base_url="/")

对于生产用途,这效果很好。但在我的单元测试中,我上传的内容现在写入 /var/data,其中包含生产数据。我尝试像这样交换 packages/tests.py 中的 PACKAGE_STORE

from django.conf import settings     # This is line 1
from tempfile import mkdtemp
settings.PACKAGE_STORAGE = FileSystemStorage(location=mkdtemp(), base_url="/")

# rest of the imports and testing code below

但真正的问题是,加载测试文件之前,packages 应用程序及其模型已经加载,因此,PACKAGE_STORAGE 设置已解决,然后我才能在测试设置代码中更改它。

是否有一种优雅的方法可以在测试上下文中覆盖此特定设置?

最佳答案

不知道这是否算优雅,但您可以使用不同的设置文件进行测试...

类似于:

# test_settings.py

from settings import *

PACKAGE_STORAGE = FileSystemStorage(location='/test/files', base_url="/")

然后使用测试设置运行测试,python manage.py test --settings=test_settings

关于django - 如何在单元测试中优雅地交换(修补)Django FileSystemStorage 设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874708/

相关文章:

隐藏但需要 OneToOneField 的 Django 创建 ModelForm

ios - 将测试用例分为不同的类

unit-testing - Grails电子邮件插件单元测试

javascript - React-Native:保存用户偏好

c# - Properties.Settings.Default 自定义列表类型未保存!

css - 如何将滚动添加到 django 渲染表?

python - DRF 3.7.0 删除了字段中的无处理并破坏了我的外键源字段。有办法解决吗?

python django 异常处理

java - Mockito stub 方法以返回类的所有实例的值

python - Django,Logout_URL 不能很好地重定向