2013-12-12 113 views
1
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() 

但显然这将无法正常工作。但是我想知道是否有一种方法来测试这个通话,并且如果打补丁的话就是这样。

回答

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 
+1

像所有好的答案,非常明显,一旦解释清楚:)感谢。 – ptr