Я хочу смоделировать вывод метода класса, который вызывается функцией, определенной в другом модуле. Например:
class_module.py
class my_class:
def __init__(self, user):
self.user = user
def my_method(self):
return [1,2,3]
def other_methods(self):
other_func(self.user)
return "something I do not really want to mock"
function_module.py
from class_module import my_class
def my_fun():
user = "me"
foo = my_class(user)
foo.other_methods()
return foo.my_method()
test.py
@patch("function_module.my_class")
def test_my_fun(class_mock):
class_mock.return_value.my_method.return_value = []
bar = my_fun()
assert bar == []
Тем не менее, я получаю AssertionError
говоря, что [1,2,3] != []
. Так что я думаю, что макет никогда не происходит в методе, который я хочу. Может кто-нибудь объяснить, как это сделать? И почему это происходит?
РЕДАКТИРОВАТЬ
На самом деле показанная реализация не работает, потому что тест запускает совершенно отдельный процесс. Следовательно, никакая функция не может быть имитирована. Извините за мое заблуждение
Спасибо @jonrsharpe, я попробовал другой ответ, который вы предоставили. Тем не менее, я все еще получаю ту же проблему. Я обновил свой вопрос, чтобы он был больше похож на мой код
Ваш код у меня работает, тест проходит локально.
patch.object позволяет пропатчить конкретный метод класса.
class_module.py
class MyClass:
def __init__(self, user):
self.user = user
def my_method(self):
return [1, 2, 3]
def other_methods(self):
return "anything"
function_module.py
from class_module import MyClass
def my_fun():
user = "me"
foo = MyClass(user)
assert foo.other_methods() == "anything"
return foo.my_method()
test_my_func.py
from unittest.mock import patch
from class_module import MyClass
from function_module import my_fun
@patch.object(MyClass, "my_method")
def test_my_fun(my_method):
# given
any_value = [99, 98, 97]
my_method.return_value = any_value
# when
result = my_fun()
# then
assert result == any_value
С этими файлами pytest test_my_func.py
проходит успешно.
Вы не исправляете ни один метод, замените класс
@patch("function_module.my_class")
, а затем см., например. stackoverflow.com/a/38199345/3001761.