我想测试一个递归函数,然后模拟出同样的函数。对于第一个电话,我想实际调用我的模块中显示的功能。当它自己调用时,我想使用mock模拟调用,并指定第二次递归调用的返回值。
我的意思的一个非常简单的例子:
def some_function(input_value):
if input_value == some_appropriate_value:
return foo
else:
return some_function(some_other_value)
第二次调用时,如何模拟some_function
?如果我使用类似@ mock.patch装饰器的东西,我实际上无法测试它,因为some_function
将被模拟用于所有通话。
有关如何执行此操作的任何建议?我找不到任何明显的Stack Overflow问题来讨论这个问题。
答案 0 :(得分:4)
如果在修补前保存该功能,则可以调用正确的版本。
copy_of_foo = foo
with patch('...foo') as foo_mock:
copy_of_foo(args...)
为了让您的补丁函数以不同的方式调用,您可以尝试以下几点:1。side_effects和2.子类化模拟对象以覆盖函数调用并保留计数器。