我正在开发一个带有不同应用程序的Django软件。我正在测试一些视图,我想在这些视图中模拟函数的返回。
例如,我有这个视图(位于apps.policies.views):
def upload_policy_document(request):
# code fragment avoid
# save document ot ipfs
response_data = save_to_ipfs(app_name=app_name,
process_instance=process_instance,
file=policy_document)
# more code avoided
return JsonResponse(data=response_data)
save_to_ipfs函数位于apps.utils.ipfs_storage,是我想要模拟的函数,无需连接到IPFS即可返回固定值。
我在apps.policies.tests.test_views上对此视图进行了一些测试。作为测试示例,我有:
class UpdatePolicyDocumentMockCase(SimpleTestCase):
IPFS_JSON_MOCK = {"Hash": "mockhash"}
def setUp(self):
# some setup before tests
@patch('apps.utils.ipfs_storage.save_to_ipfs')
def some_test(self, mock_method):
mock_method.return_value = self.IPFS_JSON_MOCK
self.assertEqual(save_to_ipfs("", "", ""), self.IPFS_JSON_MOCK)
问题是模拟不起作用,当reurn必须是self.IPFS_JSON_MOCK的内容时,它返回空。
我希望我已经正确解释了,先谢谢!
我在这里吸取了教训:
“如果你想在调用mock时运行一个函数,那就是side_effect,而不是return_value”
在TestClass之外,添加一个函数:
local_save_to_ipfs():
IPFS_JSON_MOCK = {"Hash": "mockhash"}
return IPFS_JSON_MOCK
在UpdatePolicyDocumentMockCase
内部,改变这一点,它应该工作。
它应该只是一个没有()的函数名称
mock_method.side_effect = local_save_to_ipfs()
这是没有圆括号或圆括号的正确方法
mock_method.side_effect = local_save_to_ipfs
这是一个示例的链接: