我只想模拟对使用 Mock 的方法的子集调用模块。所以,
fubar = Fubar()
fubar.myMethod = Mock()
funar.myMethod.return_value = [fubar.myMethod(), 'MyMOck', fubar.MyMethod]
会在第一次和第三次调用读取方法 myMethod,但会在第二次调用时调用模拟方法。我想这样做的原因是检查竞争条件:中间调用应该比第一个调用早返回,从而导致一些问题。至少,我希望我能做到这一点。
这可能吗?如果是这样,如何?如果不是,为什么不呢?
请您参考如下方法:
这个怎么样:
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。
如果您想以编程方式选择对 mock 的调用,您可以使用生成器而不是列表,并使用 next 而不是 pop:
fubar.myMethod = lambda self, calls = iter([myMethod, (lambda: 'MyMock'), myMethod]): next(calls)()
