我使用的模拟库是...... mock。
当我尝试为函数(遗留代码)编写测试用例时,我遇到了这个“模拟嵌套函数”问题。
这个函数使用了一个非常复杂的嵌套函数,它对其他模块有很大的依赖性。
我想知道是否可以使用mock
来模拟嵌套函数。
答案 0 :(得分:27)
例如,您需要从Google DRIVE API
模拟嵌套函数调用(链接函数)result = get_drive_service().files().insert(body='body', convert=True).execute()
所以你需要修补函数:service_mock(),files(),insert(),直到last execute()响应:
from mock import patch
with patch('path.to.import.get_drive_service') as service_mock:
service_mock.return_value.files.return_value.insert.\
return_value.execute.return_value = {'key': 'value', 'status': 200}
主要方案: 首先。 return_value 。秒。 return_value .third。 return_value .last。 return_value = rsp
答案 1 :(得分:1)
您是否尝试使用模拟对象替换嵌套函数?如果是这样,无论函数多么复杂,这都是相当简单的。您可以使用MagicMock替换几乎任何python对象。
如果您需要模拟返回某些内容的函数,则只需设置MagicMock
的{{1}}参数即可。它看起来像这样:
return_value
但是,如果您正在尝试测试在内部某处调用>>> super_nested_mock = mock.MagicMock()
>>> super_nested_mock.return_value = 42
>>> super_nested_mock()
42
函数的另一段代码,并且想要将其模拟出来,则需要使用patch。在模拟库中,它看起来像这样:
super_nested
此处,with patch('super_nested') as super_nested_mock:
super_nested_mock.return_value = "A good value to test with"
assert my_function_that_calls_super_nested(5) == 20
块中通常会调用with
的任何内容都会调用super_nested
并返回您为其设置的值。
你需要在补丁程序中调用什么内容,这有些微妙。主要是,您希望将对象修补为您正在测试的模块。有关更多说明,请参阅“where to patch”。