Как правильно использовать autospec Python mock для методов объектов? - PullRequest
0 голосов
/ 15 февраля 2019

Я получаю сообщение об ошибке при попытке использовать 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 при исправлении метода объекта без получения этого исключения.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы должны вызвать метод экземпляра объекта:

with patch.object(SimpleClass, 'target_method', autospec=True): 
    obj = SimpleClass()
    obj.target_method(2, 5)

, как описано в https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch.object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...