【问题标题】:Python mock test array of functionsPython模拟测试函数数组
【发布时间】:2020-06-04 17:23:22
【问题描述】:

以下是我的python模块my_func.py

def get_data(request):
    function_1(request)

我想测试function_1 是否在get_data() 函数中使用正确的request 参数调用,并且以下测试工作正常。

class GetDataTest(TestCase):

    @patch("my_func.function_1", autospec=True)
    def test_get_data(self, function_1_mock):
        request_mock = MagicMock()
        my_func.get_metadata(request_mock)
        function_1_mock.assert_called_once_with(request_mock)

如果我将我的 python 模块 my_func.py 更改为以下我有一系列函数的地方,那么我正在努力如何单独模拟函数。

functions = [
    function_1,
    function_2,
    function_3
]

def get_data(request):
    for function in functions:
       function(request)

【问题讨论】:

    标签: python python-unittest python-unittest.mock


    【解决方案1】:

    您实际上并不需要模拟所有函数来测试此代码。相反,我建议替换列表内容。

    首先 - 你引入工厂方法而不是模块变量:

    def get_functions():
      return [
        function_1,
        function_2,
        function_3
        ]
    
    def get_data(request):
        for function in get_functions():
           function(request)
    

    然后您可以模拟get_functions() 并在那里注入 1 个或多个函数(但根据代码我看不到注入多个函数的任何价值):

    class GetDataTest(TestCase):
    
        @patch("my_func.function_1_mock", autospec=True)
        def test_get_data(self, function_1_mock):
            my_func.get_functions = MagicMock(return_value=[function_1_mock])
            request_mock = MagicMock()
            my_func.get_metadata(request_mock)
            function_1_mock.assert_called_once_with(request_mock)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2015-11-13
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多