Я пытаюсь протестировать класс и смоделировать один из его методов, но я не могу заменить поведение одного из методов экземпляра своим смоделированным поведением. Мой код организован так:
--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)