2

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

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

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

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

4

1 回答 1

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 的主体中传递参数,或者 partial-apply myMethod

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

fubar.myMethod = lambda self, calls = iter([myMethod, (lambda: 'MyMock'), myMethod]): next(calls)()
于 2012-04-18T15:48:14.690 回答