python - 单元测试super()调用

时间:2013-12-12 09:38:33

标签: 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()的{​​{1}} 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()

但显然这不起作用。但我想知道是否有一种方法来测试呼叫,如果修补是可行的方法。

1 个答案:

答案 0 :(得分:1)

来自文档(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