【问题标题】:Django - how to change FileField upload_to path during testingDjango - 如何在测试期间更改 FileField upload_to 路径
【发布时间】:2012-11-04 11:07:35
【问题描述】:

我正在为带有 FileField 的 Django 模型编写测试用例。我想更改上传路径以防止测试对系统的其余部分产生副作用。

我已尝试将可调用对象传递给 upload_to 并在测试中对其进行修补:

#models.py
upload_path = lambda x, y: 'files'
class Model(models.Model):
    file = models.FileField(upload_to=upload_path)

#tests.py
test_path = mock.Mock()
test_path.return_value = 'files/test'
@mock.patch('models.upload_path', new=test_path)
class ModelTest(object):
    ...

但是这似乎不起作用,我相信原因是在任何测试代码运行之前,upload_path 已被 FileField 取消引用,因此修补内容为时已晚。

如何让测试代码更改upload_to 是什么?如果做不到这一点,模型如何检查它是否正在通过测试运行?

【问题讨论】:

  • 在文档上它说:“目标是在执行装饰功能时导入的,而不是在装饰时。”我相信,当您修补“upload_path”时,您的 Model.file 对象已经在所有导入发生时使用不同的 upload_to 进行了设置。可能更容易修补 Model.file 而不是 upload_path
  • @andrefsp 我使用Model.add_to_class("file", models.FileField(upload_to='files/test')) 让它工作了 - 我不知道这是否是正确的方法,但它有效 - 谢谢!

标签: django testing nosetests python-mock


【解决方案1】:

我想你快到了,但要获得你想要的后期评估,你需要将 file_path 作为你想要修补的变量放入,然后使用 lambda 来延迟绑定:

#models.py
upload_path = 'files'
class Model(models.Model):
    file = models.FileField(upload_to=lambda x,y: upload_path)

#tests.py
@mock.patch('models.upload_path', 'files/test')
class ModelTest(object):
    ...

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多