Не желая проверять вручную мой код, я пытаюсь написать тест, который проверяет / исправляет одну из моих зависимостей (PyInquirer - довольно удобный пакет, который обрабатывает CLI для меня - вопрос вписывается, ответ в ответ).
Тем не менее, будучи новичком в Python, я испытываю трудности с высмеиванием этой зависимости.Вот код, который я тестирую:
from PyInquirer import prompt
class Foo:
def bar(self):
# this line is asking the user for inpit, and that's what I want to mock.
a = prompt({'name': 'q',
'type': 'input',
'message': 'well, foo'})
print("f is", f)
return a
И вот этот тест:
import unittest
from unittest.mock import patch
from Foo import Foo
class TestFoo(unittest.TestCase):
@patch('PyInquirer.prompt', return_value=24)
def test_bar(self):
f = Foo()
a = f.bar()
assert a == 24
if __name__ == '__main__':
unittest.main()
(реальный код, очевидно, более сложный, но в этом суть проблемы),Что проявляется как:
Error
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/case.py", line 59, in testPartExecutor
yield
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/case.py", line 605, in run
testMethod()
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 1179, in patched
return func(*args, **keywargs)
TypeError: test_bar() takes 1 positional argument but 2 were given
Я в замешательстве.
Если я опускаю декоратор патча, вызов завершается неудачно с ожидаемой ошибкой утверждения - словарь, созданный по запросу, неравно 24. Но если я предоставлю декоратор, я получу несоответствие аргумента выше.И действительно, последняя строка в трассировке стека показывает, что функция «func», к которой, как я полагаю, применялось декоратор, вызывается с двумя аргументами ... но ... почему?Не может быть суть проблемы?Таким образом, только функции с арностью двух могут быть исправлены =)