0
如何解決這個問題?使用另一個簽名修補一個對象方法(例如,一個額外的參數)我嘗試綁定可選參數,但這似乎不起作用,我不能在這裏使用普通的猴子修補,因爲修補過的類在下面調用一個位置,我無法以其他方式打補丁這種方式Python mock.patch.object與functool.partial綁定參數可能嗎?
任何幫助表示讚賞
import mock
import functools
# this class lives in another (unchangeable) module, __len__ method has to be patched
class ToOverride(object):
def __len__(self):
raise NotImplementedError()
# this code is changeable
def my_len(self, arg):
return arg+1
my_len_bound = functools.partial(my_len, arg=1)
with mock.patch.object(ToOverride, '__len__', my_len_bound):
inst = ToOverride()
print len(inst) # expected output: 2
當調用上下文mock.patch.object,我得到以下錯誤:。
TypeError Traceback (most recent call last)
<ipython-input-7-bfdb41d8628f> in <module>()
1 with mock.patch.object(ToOverride, '__len__', my_len_bound):
2 inst = ToOverride()
----> 3 print len(inst)
TypeError: my_len() takes exactly 2 arguments (1 given)
但是調用my_len作爲第一個參數作爲EXP (打印出2)。
假設它可能只是猴子補丁,它可以工作,如果len被手動調用,實例作爲第一個參數。但是,這當然是不希望的:
ToOverride.__len__ = my_len_bound
inst = ToOverride()
print(inst.__len__(inst)) # 2