部分模拟父子类
创始人
2024-12-24 05:30:11
0

部分模拟是指在单元测试过程中,部分模拟一个对象,而不改变其实例中未被模拟的部分,这在只需要测试某个方法的情况下非常有用。但在涉及到父子类的情况下,可能会遇到一些问题。

假设有如下的父类和子类:

class Parent:
    def foo(self):
        print("parent foo")

class Child(Parent):
    def bar(self):
        self.foo()
        print("child bar")

现在我们想要只模拟Child类的bar方法,我们可以使用unittest中的mock模块来部分模拟:

from unittest.mock import patch

class TestChild(unittest.TestCase):
    def test_bar(self):
        with patch.object(Child, "foo") as mock_foo:
            c = Child()
            c.bar()
            mock_foo.assert_called_once()

然而,mock_foo.assert_called_once()将会失败并报错,因为调用的方法实际上是Parent类中的foo方法,而不是Child类。这是因为一旦覆盖子类中的方法,就无法正确地调用其父类中的同名方法。

解决方法是将被模拟的方法重命名,以避免与父类中同名方法的冲突。例如,我们可以将Child类中的foo方法重命名为_child_foo方法:

class Child(Parent):
    def _child_foo(self):
        print("child foo")
        
    def bar(self):
        self._child_foo()
        print("child bar")

现在,我们将它们打包在一起:

class TestChild(unittest.TestCase):
    def test_bar(self):
        with patch.object(Child, "_child_foo") as mock_foo:
            c = Child()
            c.bar()
            mock_foo.assert_called_once()

现在,我们可以成功地部分模拟Child类的bar方法,而不会影响Parent类中的同名方法。

相关内容

热门资讯

黑科技科技(wepoke智能a... 黑科技科技(wepoke智能ai)wepower使用说明书(wepOkE)素来是真的有挂(确实有挂)...
黑科技模拟器(wepoke智能... WePoker透视辅助工具核心要点解析‌,黑科技模拟器(wepoke智能ai)wepoke是机器发牌...
黑科技脚本(wepokeai代... 您好,这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这款游戏中打牌都...
黑科技辅助挂(wepoke真的... 黑科技辅助挂(wepoke真的有挂)wepoke 软件(wEPOKE)固有真的有挂(有挂猫腻)-哔哩...
黑科技辅助挂(wepoke黑科... 黑科技辅助挂(wepoke黑科技)wepoke软件透明挂演示(wEpOke)一直真的有挂(真的有挂)...
黑科技app(wepoke真的... 此外,数据分析德州()辅助神器app还具备辅助透视行为开挂功能,通过对客户透明挂的深入研究,你可以了...
黑科技智能ai(wepoke辅... 黑科技智能ai(wepoke辅助插件)wepoke软件透明(WEPOke)先前是有挂(果真有挂)-哔...
黑科技模拟器(wepoke透明... 黑科技模拟器(wepoke透明黑科技)wepoke德州扑克用ai代打(WEPOKE)最初存在有挂(有...
黑科技插件(wepoke辅助插... 黑科技插件(wepoke辅助插件)wepoke软件透明(WEPOke)从来是真的有挂(有挂解惑)-哔...
黑科技美元局(wepoke智能... 黑科技美元局(wepoke智能ai)wepoke辅助真的假的(wepoKE)原先真的有挂(竟然有挂)...