【发布时间】:2016-09-09 14:54:45
【问题描述】:
我在 patch.object 中遇到了一个令人惊讶的 side_effect 参数行为,其中替换原始的函数没有收到 self
class Animal():
def __init__(self):
self.noise = 'Woof'
def make_noise(self):
return self.noise
def loud(self):
return self.noise.upper() + '!!'
from unittest.mock import patch
dog = Animal()
dog.make_noise()
with patch.object(Animal, 'make_noise', side_effect=loud):
dog.make_noise()
这个给:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/lustre/home/production/Applications/python/python-3.4.4/lib/python3.4/unittest/mock.py", line 902, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/lustre/home/production/Applications/python/python-3.4.4/lib/python3.4/unittest/mock.py", line 968, in _mock_call
ret_val = effect(*args, **kwargs)
TypeError: loud() missing 1 required positional argument: 'self'
如果我将loud 函数更改为
def loud(*args, **kwargs):
print(args)
print(kwargs)
我得到以下输出:
()
{}
有没有办法从一个对象中替换一个函数并仍然接收自我?
【问题讨论】:
标签: python unit-testing mocking