Я получаю сообщение об ошибке при попытке использовать autospec=True
при издевательстве над методом объекта.Я напишу простой пример, показывающий, как воспроизвести ошибку, которую я получаю.Предположим, у меня есть очень простой класс, подобный следующему:
class SimpleClass:
def target_method(self, a, b):
return a + b
Теперь в другой части моей системы у меня есть функция, которая взаимодействует с экземпляром SimpleClass
, выполняя print(obj.target_method(a, b))
, и я имеюоднократно протестировать эту функцию.Я хотел бы протестировать его путем насмешки target_method
с autospec=True
, чтобы убедиться в сигнатуре метода и проверить, был ли он вызван так, как ожидалось.Это когда я получаю ошибку, как описано ниже:
In [24]: with patch.object(SimpleClass, 'target_method', autospec=True) as mock:
...: mock(2, 5)
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-24-04b2a0db8a31> in <module>
1 with patch.object(SimpleClass, 'target_method', autospec=True) as mock:
----> 2 mock(2, 5)
3
<string> in target_method(*args, **kwargs)
/usr/lib/python3.6/unittest/mock.py in checksig(*args, **kwargs)
169 func, sig = result
170 def checksig(*args, **kwargs):
--> 171 sig.bind(*args, **kwargs)
172 _copy_func_details(func, checksig)
173
/usr/lib/python3.6/inspect.py in bind(*args, **kwargs)
2987 if the passed arguments can not be bound.
2988 """
-> 2989 return args[0]._bind(args[1:], kwargs)
2990
2991 def bind_partial(*args, **kwargs):
/usr/lib/python3.6/inspect.py in _bind(self, args, kwargs, partial)
2902 msg = 'missing a required argument: {arg!r}'
2903 msg = msg.format(arg=param.name)
-> 2904 raise TypeError(msg) from None
2905 else:
2906 # We have a positional argument to process
TypeError: missing a required argument: 'b'
Если я правильно понимаю, mock
выполняет себя как отдельную функцию и, таким образом, требует self
параметр, который нужно передать явно.
Итак, мой вопрос: есть ли способ использовать autospec
при исправлении метода объекта без получения этого исключения.