我想只使用Mock模块模拟对方法的一组子调用。所以,
fubar = Fubar()
fubar.myMethod = Mock()
funar.myMethod.return_value = [fubar.myMethod(), 'MyMOck', fubar.MyMethod]
将第一次和第三次调用read方法myMethod
,但会在第二次调用时调用mocked方法。我想这样做的原因是检查竞争条件:中间调用应该比第一个更早返回,从而导致一些问题。至少,我希望我能这样做。
这可能吗?如果是这样,怎么样?如果没有,为什么不呢?
答案 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)()