Django - 如何在测试期间更改FileField upload_to路径

时间:2012-11-04 11:07:36

标签: django testing nosetests python-mock

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

我已经尝试将callable传递给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):
    ...

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

如何让测试代码更改upload_to的内容?如果做不到这一点,模型如何检查它是否由测试运行?

1 个答案:

答案 0 :(得分:4)

我认为你几乎就在那里,但是为了获得你想要的后期评估,你需要将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):
    ...