Как смоделировать метод экземпляра в Python - PullRequest
3 голосов
/ 15 марта 2019

Я пытаюсь протестировать класс и смоделировать один из его методов, но я не могу заменить поведение одного из методов экземпляра своим смоделированным поведением. Мой код организован так:

--src ----module ------__init__.py ------my_class.py --tst ----__init__.py ----test_my_class.py

my_class.py содержит следующее

class MyClass:

    def __init__(self):
        pass

    def do_something(self):
        return 'Real Output'

Мой тестовый файл test_my_class.py содержит следующее.

from unittest.mock import patch
from src.module.my_class import MyClass

def test_my_class():
    my_class = MyClass()
    assert my_class.do_something() == 'Real Output'

@patch('src.module.my_class.MyClass')
def test_mock_my_class(mock_my_class):
    mock_my_class.return_value.do_something.return_value = 'Mocked Output'
    my_class = MyClass()
    assert my_class.do_something() == 'Mocked Output'

Первый тест работает просто отлично (пока не было насмешек). Второй тест, однако, дает мне следующую ошибку утверждения. Я ожидаю, что метод do_something() будет смоделирован и вернет "Mocked Output", а оператор assert оценивается как true. Куда я здесь не так?

AssertionError: assert <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> == 'Mocked Output' E + where <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> = <src.module.my_class.MyClass object at 0x1057133c8>.do_something

PS. Я проверил следующие ресурсы без успеха:

Эта последняя ссылка сначала выглядела особенно полезной, потому что я почти дословно следую за одним из примеров, но она все еще не работает.

@mock.patch("simple.SimpleClass")
def mock_simple_class(mock_class):
    mock_class.return_value.explode.return_value = "BOO!"
    inst = simple.SimpleClass()
    result = inst.explode()
    print(result)

1 Ответ

0 голосов
/ 15 марта 2019

Более подходящий способ решить эту проблему - использовать patch.object

@patch.object(MyClass, "do_something")
def test_mock_my_class(m):
    m.side_effect = ['Mocked Output']
    my_class = MyClass()
    assert my_class.do_something() == 'Mocked Output'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...