7

我想测试一个递归函数,然后模拟出同样的函数。对于第一次调用,我想实际调用出现在我的模块中的函数。当它调用自己时,我想使用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 问题来讨论这个问题。

4

1 回答 1

7

如果您在修补之前保存该功能,则可以调用正确的版本。

copy_of_foo = foo
with patch('...foo') as foo_mock:
   copy_of_foo(args...)

为了让您的修补函数以不同的方式调用,您可以尝试一些事情:1. side_effects 和 2. 子类化一个模拟对象以覆盖函数调用并保留一个计数器。

于 2015-01-16T18:24:10.700 回答