Skip to main content
 首页 » 编程设计

python之仅模拟对方法的所有调用的一个子集

2025年05月04日7傻小

我只想模拟对使用 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)()