通过

问题描述 投票:0回答:1

我正在尝试使用与此类似的设置来模拟类的超类:

文件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()
)是在子类方法内部,否则我可以简单地为其分配我想要调用的函数。

python testing mocking tdd patch
1个回答
0
投票

此时我找到了这个解决方案,需要更改类

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()
方法。

© www.soinside.com 2019 - 2024. All rights reserved.