蟒蛇 - 单元测试超()调用(python - unittesting super() calls)

2019-10-19 02:57发布

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()

但很明显,这是行不通的。 但我不知道是否有测试呼叫的方式,如果修补是去了解它的方式。

Answer 1:

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

super(type[, object-or-type])
返回一个代理对象委托方法调用到父母或兄弟姐妹类类型的。 这是用于访问在一个类中被重写继承的方法有用。 搜索顺序是相同由GETATTR()不同之处在于类型本身被跳过使用。 <...>

有两种典型的用例超。

  • 在类层次结构与单继承,超可以用来指代父类不点名明确,从而使代码更易于维护。 <...>

  • 第二个用例是支持的协同多继承在一个动态的执行环境。 <...>

__

换句话说, 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


文章来源: python - unittesting super() calls