代码之家  ›  专栏  ›  技术社区  ›  briancaffey

在unittest.mock中将参数传递给用于修补的side_-effect函数

  •  1
  • briancaffey  · 技术社区  · 6 年前

    我在用 patch unittest.mock 在我的测试中更改远程API调用的行为。

    我有三个不同的函数返回三个不同的 json 表示要从API返回的模拟数据的文件。对于每个模拟API调用,我正在设置 side_effect 作为这些功能之一。这个模式不干燥,但我不知道如何将参数传递给 旁侧效应 功能。

    三个模拟API调用函数如下所示:

    def mock_api_call_1():
        with open('path/to/mock_1.json') as f:
            mock_data = json.load(f)
        return mock_data
    

    这是我的测试

    class MyTest(TestCase):
    
        def test_api(self):
    
            with patch('mymodule.utils.api_call', side_effect=mock_api_call_1):
                do_crud_operations()
                self.assertEqual(MyModel.objects.all().count(), 10)
    
            with patch('mymodule.utils.api_call', side_effect=mock_api_call_2):
                do_crud_operations()
                self.assertEqual(MyModel.objects.all().count(), 11)
    

    如何重构此代码以将参数传递给 旁侧效应 ( mock_call(1) 而不是 mock_call_1 )

    unittest docs 我明白了:

    副作用:每当调用mock时要调用的函数。见 副作用属性。有助于提出例外或 动态更改返回值。函数是用 与mock的参数相同,除非它返回默认值,否则返回 此函数的值用作返回值。

    我看到函数传递给 旁侧效应 采用与mock相同的论点,但我仍然不确定如何最好地使用mock来实现这一点。我最终会想添加更多的测试用例,所以我不想硬编码不同的 mock_api_call 功能。

    2 回复  |  直到 6 年前
        1
  •  1
  •   progmatico    6 年前

    使用lambda函数:

    from unittest import TestCase, main
    from unittest.mock import Mock, patch
    import sys
    
    def mock_api_call(x):
        print(x)
    
    class MyTest(TestCase):
        def test_api(self):
            with patch('sys.exit',
                        side_effect=lambda x: mock_api_call(x)) as m:
                m(0)
                sys.exit(0)
    
                m(1)
                sys.exit(1)
    
    
    if __name__ == '__main__':
        main()
    
        2
  •  0
  •   briancaffey    6 年前

    我认为最简单的方法是 side_effect 返回函数的函数。

    def mock_call(num):
        def wrapper():
            with open("path/to/mock_{num}.json") as f:
                data = json.load(f)
            return data
        return wrapper
    

    现在我可以通过 mock_call(1) 旁侧效应 它会像预期的那样运作。

    推荐文章