如何模拟嵌套函数?

时间:2012-09-21 01:38:38

标签: python unit-testing mocking closures

我使用的模拟库是...... mock

当我尝试为函数(遗留代码)编写测试用例时,我遇到了这个“模拟嵌套函数”问题。

这个函数使用了一个非常复杂的嵌套函数,它对其他模块有很大的依赖性。

我想知道是否可以使用mock来模拟嵌套函数。

2 个答案:

答案 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”。