gpt4 book ai didi

python - 将参数传递给 side_effect 函数以在 unittest.mock 中打补丁

转载 作者:行者123 更新时间:2023-12-03 23:13:56 24 4
gpt4 key购买 nike

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

我有三个不同的函数,它们返回三个不同的 json表示要从 API 返回的模拟数据的文件。对于每个模拟 api 调用,我正在设置 side_effect成为这些功能之一。这种模式不是 DRY,但我不知道如何将参数传递给 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)

如何重构此代码以便能够将参数传递给 side_effect ( mock_call(1) 而不是 mock_call_1 )。

来自 unittest docs , 我看到:

side_effect: A function to be called whenever the Mock is called. See the side_effect attribute. Useful for raising exceptions or dynamically changing return values. The function is called with the same arguments as the mock, and unless it returns DEFAULT, the return value of this function is used as the return value.



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

最佳答案

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

关于python - 将参数传递给 side_effect 函数以在 unittest.mock 中打补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com