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