代码之家  ›  专栏  ›  技术社区  ›  Albert Diaz

包外模拟函数

  •  1
  • Albert Diaz  · 技术社区  · 7 年前

    我正在开发一个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\u to\u ipfs”功能位于应用程序中。UTIL。ipfs\u存储,是我想要模拟的函数,用于返回固定值,而无需连接到ipfs。

    我在应用程序中对此视图进行了一些测试。政策。测验。test\u视图。作为测试示例,我有:

    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)
    

    问题是mock不起作用,当reurn必须是self的内容时,它返回空的。IPFS\u JSON\u模拟。

    我希望我的解释正确,提前谢谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Gang    7 年前

    我在这里吸取了教训:

    如果要在调用mock时运行函数,这是副作用,而不是返回值

    在TestClass之外,添加一个func:

    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/