Python Unittest издевательства / исправления - PullRequest
0 голосов
/ 25 сентября 2018

Не желая проверять вручную мой код, я пытаюсь написать тест, который проверяет / исправляет одну из моих зависимостей (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», к которой, как я полагаю, применялось декоратор, вызывается с двумя аргументами ... но ... почему?Не может быть суть проблемы?Таким образом, только функции с арностью двух могут быть исправлены =)

1 Ответ

0 голосов
/ 25 сентября 2018

Ваш класс использует имя Foo.prompt (из-за того, как вы его импортируете), поэтому это то, что вам нужно исправить.

class TestFoo(unittest.TestCase):
    @patch('Foo.prompt', return_value=24)
    def test_bar(self, mock_prompt):
        f = Foo()
        a = f.bar()
        assert a == 24

Вам также необходимо добавить параметрна test_bar, чтобы получить исправленный объект, планируете ли вы его использовать.Если вы не хотите этого делать, вы можете переместить вызов на patch внутри метода, используя его с оператором with.

class TestFoo(unittest.TestCase):
    def test_bar(self):
        with patch('Foo.prompt', return_value=24):
            f = Foo()
            a = f.bar()
            assert a == 24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...