我正在尝试使用与此类似的设置来模拟类的超类:
文件parent.py
class Parent:
def write(self):
*some code*
文件child.py
class Child(Parent):
def write(self):
*more code*
super().write()
文件mock_parent.py
class MockParent(Parent):
def write(self):
...
我的目标是用
Parent
替换 MockParent
,通过消除实际硬件资源来改进 Child
的测试。
到目前为止,我尝试使用模拟补丁但没有成功。我尝试修补导入、bases 和 super,但这些尝试都没有成功。我可以替换 Child 对象的内部结构,但我更愿意通过潜在的修补获得更干净的解决方案。
最大的挑战是对父类方法
write
的调用(通过super().write()
)是在子类方法内部,否则我可以简单地为其分配我想要调用的函数。
此时我找到了这个解决方案,需要更改类
write
的方法Child
的代码。此修改只能在测试期间使用,而在生产代码中,您必须使用生产代码。
下面我向您展示包含生产代码和测试代码的文件
test_code.py
:
import unittest
from unittest.mock import Mock
class Parent:
def write(self):
print("parent.write()")
class Child(Parent):
def write(self, *super_class):
print("child.write()")
# ----> Here I have changed your code
if len(super_class) > 0:
super_class[0].write()
else:
# ----> ... here you find your production code
super().write()
class MockParent(Parent):
def write(self):
print("mock_parent.write()")
class MyTestCase(unittest.TestCase):
def test_with_parent_mock(self):
print("Execution of test_with_parent_mock")
mock_parent = Mock(wraps = MockParent())
child = Child()
child.write(mock_parent)
mock_parent.write.assert_called_once()
def test_with_parent(self):
print("Execution of test_with_parent")
child = Child()
child.write()
if __name__ == '__main__':
unittest.main()
如果通过命令
python test_code.py
执行此代码,您将获得以下输出:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Execution of test_with_parent
child.write()
parent.write()
Execution of test_with_parent_mock
child.write()
mock_parent.write()
测试方法
test_with_parent_mock()
的输出表明您可以用write()
中定义的其他方法替换超类的MockParent
方法。
相反,在方法
test_with_parent()
中,您可以正常调用 Child 类的 write()
方法。