Мне нужно смоделировать MyClassFactory
, который возвращает объект MyClass. У этого объекта есть метод getNum
Мне тоже нужно высмеивать. Я не уверен, как это сделать, поскольку фабрика больше не возвращает MyClass
, а вместо этого <MagicMock name='mock().create()'...>
.
import unittest
from mock import MagicMock, Mock, patch
class MyClass:
def getNum(self):
return 10
class MyClassFactory:
def create(self):
return MyClass()
class Runner:
def foo(self):
myClassFactory = MyClassFactory()
myClass = myClassFactory.create()
num = myClass.getNum()
if num == 10:
print("foo successful")
else:
print("foo fail, num={}".format(num))
class TestRoute(unittest.TestCase):
# Attempt at patching the methods
@patch("__main__.MyClassFactory", create=True, new=MagicMock())
@patch("__main__.MyClass", create=True, new=MagicMock())
@patch("__main__.MyClass.getNum", create=True, new=MagicMock(return_value=11))
def test_foo_fail(self):
runner = Runner()
runner.foo()
if __name__ == '__main__':
unittest.main()
Фактический вывод:
foo fail, num=<MagicMock name='mock().create().getNum()' id='140554774258128'>
Желаемый вывод:
foo fail, num=11
Это <MagicMock name='mock().create().getNum()'...>
не то, что я хочу. Я попытался использовать return_value=11
для смоделированного метода, но он не вызывается.
TLDR: У меня есть фабрика, которую мне нужно смоделировать. Возвращает класс. У этого класса есть метод, который мне также нужен для насмешки return_value, что я не могу сделать. В основном я хочу превратить mock().create().getNum()
в 11
.