2012-04-18 52 views
2

我想嘲笑只使用Mock模塊的一個方法的子集。所以,只模擬一個方法的所有調用的子集

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

會調用read方法myMethod第一和第三的時間,但將要求在第二次調用的模擬的方法。我想這樣做的原因是爲了檢查競爭情況:中間呼叫應該比第一次更早地返回,因此導致一些問題。至少,我希望我能這樣做。

這可能嗎?如果是這樣,怎麼樣?如果不是,爲什麼不呢?

+0

爲什麼_earth_你會想這樣做?要麼你正在測試方法,要麼你不是。 – katrielalex 2012-04-18 14:34:20

+0

@katrielalex:謝謝。我編輯了主帖。 – Sardathrion 2012-04-18 14:36:02

回答

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)() 
相關問題