模拟功能外包

问题描述 投票:1回答:1

我正在开发一个带有不同应用程序的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的内容时,它返回空。

我希望我已经正确解释了,先谢谢!

python-3.x unit-testing testing mocking django-tests
1个回答
0
投票

我在这里吸取了教训:

“如果你想在调用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

这是一个示例的链接:

https://fgimian.github.io/blog/2014/04/10/using-the-python-mock-library-to-fake-regular-functions-during-tests/

© www.soinside.com 2019 - 2024. All rights reserved.