Python-单元测试Super()调用

2022-05-17 00:00:00 python python-unittest

问题描述

class A(object):

    def get_value(self):
        return "foo"


class B(A):

    def get_value(self):
        value = super(B, self).get_value()
        value + "bar"
        return value

给定上述类,当我想要为B()类编写一个测试套件时,我应该如何模拟super()A()get_value()方法的调用?我想要的伪代码是:

class BTestCase(TestCase):

    def setUp(self):
        self.b = B()

    def test_get_value(self):
        # This won't work, attribute error- "super" object has
        # no attribute get_value
        super(B, self.b).get_value = Mock()
        super(B, self.b).get_value.assert_called_once_with()

但显然这是行不通的。但我想知道是否有一种方法来测试呼叫,打补丁是不是可行。


解决方案

来自文档(http://docs.python.org/2/library/functions.html#super)

super(type[, object-or-type])
将委托方法调用的代理对象返回给类型的父类或兄弟类。这对于访问类中已重写的继承方法很有用。搜索顺序与getattr()使用的相同,只是跳过了类型本身。 <;...>

Super有两个典型的用例。

  • 在具有单继承的类层次结构中,Super可以用来引用父类,而无需显式命名它们,从而使代码更具可维护性。<;...>

  • 第二个用例是支持动态执行环境中的协作多重继承。<;...>

__

换句话说,super是用于获取方法和属性的类,不是用于设置方法和属性的类。

如果您想要修补某个东西,请直接使用实例或类:

class A(object): ...
class B(A): ...
b = B()

super(B, b).get_value = Something()  # no
b.get_value = Something()  # ok
B.get_value = Something()  # ok
A.get_value = Something()  # ok

相关文章