模拟只调用方法的所有调用的子集

时间:2012-04-18 14:28:09

标签: python mocking

我想只使用Mock模块模拟对方法的一组子调用。所以,

fubar = Fubar()
fubar.myMethod = Mock()
funar.myMethod.return_value = [fubar.myMethod(), 'MyMOck', fubar.MyMethod]

将第一次和第三次调用read方法myMethod,但会在第二次调用时调用mocked方法。我想这样做的原因是检查竞争条件:中间调用应该比第一个更早返回,从而导致一些问题。至少,我希望我能这样做。

这可能吗?如果是这样,怎么样?如果没有,为什么不呢?

1 个答案:

答案 0 :(得分:1)

这个怎么样:

fubar = Fubar()
myMethod = fubar.myMethod # note instance fubar, resulting in a bound method.
fubar.myMethod = lambda self, calls = [myMethod, (lambda: 'MyMock'), myMethod]: calls.pop()()

这假定myMethod不带参数。您可以根据需要在lambda的主体中传递参数,也可以部分地应用myMethod

如果要以编程方式选择模拟调用,可以使用生成器而不是列表,next而不是pop

fubar.myMethod = lambda self, calls = iter([myMethod, (lambda: 'MyMock'), myMethod]): next(calls)()