部分模拟父子类
创始人
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类中的同名方法。

相关内容

热门资讯

科普攻略!德普之星辅助器app... 科普攻略!德普之星辅助器app,we poker辅助器,德州论坛(有挂软件)是一款可以让一直输的玩家...
重大科普!佛手在线大菠萝智能辅... 重大科普!佛手在线大菠萝智能辅助器,wepoker作弊辅助,分享教程(有挂软件);原来确实真的有挂(...
一分钟教会你!wepoker怎... 一分钟教会你!wepoker怎么增加运气,epoker透视,切实教程(有挂透视)1、点击下载安装,微...
六分钟了解!hhpoker有辅... 六分钟了解!hhpoker有辅助吗,wepoker国外版透视,扑克教程(有挂技巧)科技教程也叫必备教...
我来教大家!wepoker辅助... 我来教大家!wepoker辅助透视,wepoker免费脚本弱密码,详细教程(有挂透明);wepoke...
记者发布!wpk辅助,德普之星... 记者发布!wpk辅助,德普之星透视辅助软件激活码,解密教程(有挂辅助);亲真的是有正版授权,小编(透...
揭秘攻略!aapoker万能辅... 《揭秘攻略!aapoker万能辅助器,hhpoker真的假的,揭秘教程(有挂教程)》 aapoker...
重大通报!sohoo poke... 自定义sohoo poker辅助器系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用...
三分钟了解!wpk辅助器,hh... 1、三分钟了解!wpk辅助器,hhpoker免费辅助器,必赢教程(有挂神器);详细教程。2、hhpo...
玩家必看攻略!wejoker私... 玩家必看攻略!wejoker私人辅助软件,智星德州可以透视吗,透明挂教程(有挂技巧)关于智星德州可以...