我想模拟一个对象的实例化,以便返回的对象是一个 MagicMock 对象。我的文件结构如下:
home_folder
|
|-namespace
| |-Class1.py
| |-Class2.py
|
|-tests
|-unit_tests
|-test_Class2.py
Class1.py 的内容为:
class Class1:
... class members ...
Class2.py 的内容为:
from Class1 import Class1
class Class2(Class1):
classMethod(self):
objInst = Class1()
... some logic ...
return objInst
test_class2.py 的内容是:
from unittest import TestCase
from Class1 import Class1
from Class2 import Class2
from unittest.mock import patch, MagicMock
class TestClass2(TestCase):
@patch("namespace.Class2.Class1")
def test_classMethod(self, mock_class1):
cl2Obj = Class2()
cl1Obj = MagicMock(Class1())
mock_class1.return_value = cl1Obj
r = cl2Obj.classMethod()
self.assertEqual(cl1Obj, r)
运行这个测试给了我:
<Class1.Class1 object at 0xnum> != <MagicMock name='Class1()' spec='Class1' id=num>
我尝试使用
@patch("namespace.Class1.Class1")
但这没有帮助。试
mock_class1.__init__.return_value = cl1Obj
抛出一个错误说
Attribute Error: 'method' object has no attribute 'return_value'
我如何模拟 objInst = Class1() 以便 objInst 最终持有一个 MagicMock 对象?
最佳答案
你让这比它需要的更复杂。 mock_class1
已经是一个可调用的对象,并将返回另一个模拟 - 无论在何处调用它都是相同的。所以这很好用:
class TestClass2(TestCase):
@patch("namespace.Class2.Class1")
def test_classMethod(self, mock_class1):
cl2Obj = Class2()
cl1Obj = mock_class1()
r = cl2Obj.classMethod()
self.assertEqual(cl1Obj, r)
关于python - 模拟 Python 对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52995696/