我正在为一个带有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的内容?如果做不到这一点,模型如何检查它是否由测试运行?
答案 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):
...