Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在unittest.mock中将参数传递给用于修补的side_effect函数_Python_Unit Testing_Python Unittest_Python Mock - Fatal编程技术网

Python 在unittest.mock中将参数传递给用于修补的side_effect函数

Python 在unittest.mock中将参数传递给用于修补的side_effect函数,python,unit-testing,python-unittest,python-mock,Python,Unit Testing,Python Unittest,Python Mock,我正在使用unittest.mock中的patch来更改测试中远程API调用的行为 我有三个不同的函数,它们返回三个不同的json文件,表示从API返回的模拟数据。对于每个模拟api调用,我将side\u effect设置为这些函数之一。这个模式并不干燥,但我不知道如何将参数传递给副作用函数 三个模拟api调用函数如下所示: def mock_api_call_1(): with open('path/to/mock_1.json') as f: mock_data =

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

我有三个不同的函数,它们返回三个不同的
json
文件,表示从API返回的模拟数据。对于每个模拟api调用,我将
side\u 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\u call(1)
而不是
mock\u call\u 1

从中,我看到:

副作用:在调用Mock时调用的函数。看见 副作用属性。用于引发异常或异常 动态更改返回值。使用 参数与mock相同,除非它返回DEFAULT,否则返回 此函数的值用作返回值


我看到传递给
side_effect
的函数采用了与mock相同的参数,但我仍然不确定如何最好地使用mock来实现这一点。我最终会想添加更多的测试用例,所以我不想硬编码不同的
mock\u api\u调用
函数。

我认为最简单的方法是将
副作用
设置为返回函数的函数

def mock_call(num):
    def wrapper():
        with open("path/to/mock_{num}.json") as f:
            data = json.load(f)
        return data
    return wrapper
现在我可以将模拟调用(1)
传递到副作用,它将按预期运行。

使用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()