#python #python-3.x #python-mock
#python #python-3.x #python-макет
Вопрос:
Я пытаюсь издеваться над функцией, которая должна вызываться при вызове метода класса:
# SomeClass.py
from some_module import some_function
class SomeClass:
def some_method(self, *a, **kw):
...
some_function()
...
# tests.py
from mock import patch
from some_package.SomeClass import SomeClass
class TestSomeClass:
@patch('SomeClass.some_function') # <- error
def test__some_function__called(self, mocked_function):
...
SomeClass().some_method()
mocked_function.assert_called()
Тем не менее, я продолжаю получать сообщение об ошибке, в котором SomeClass
не вызывается метод some_function
.
Ответ №1:
Проблема связана с тем, что имя модуля и имя класса совпадают, т. Е. SomeClass
. Это вызывает patch
некоторую путаницу.
Решение: комбинация importlib
и переопределение функции импортированных модулей с Mock()
:
# tests.py
import importlib
from mock import Mock
from some_package.SomeClass import SomeClass
class TestSomeClass:
def test__some_function__called(self):
some_class_module = importlib('some_package.SomeClass') # this is the actual module
some_class_module.some_function = Mock()
...
SomeClass().some_method()
some_class_module.some_function.assert_called() # <- no more error - tests pass
Вот как я решил эту проблему — если у кого-нибудь есть альтернативное решение, было бы здорово его услышать. Надеюсь, это поможет кому-либо с подобной проблемой.