测试在初始化期间是否调用了super()会产生AttributeError

时间:2015-12-30 11:38:37

标签: python unit-testing mocking

我想测试在以下场景中是否在Derived类初始化期间调用Base类的init例程:

class Base(object):
    def __init__(self, a):
        self.a = a

class Derived(Base):
    def __init__(self, a):
        super(Derived, self).__init__(a)

我使用了this post here,此测试运行良好:

@mock.patch("mocktest.Base.__init__")
def test_calls_init_routine_of_base(mock_super_init):
    Derived(1)
    assert mock_super_init.called

但是,如果Derived类在a之后使用属性super(Derived, self).__init(a)执行某些操作,例如如果我在调用super()之后立即放置print(self.a),那么测试会抛出一个AttributeError:

AttributeError: 'Derived' object has no attribute 'a'

我该怎样防止这种情况?在这种情况下是否有其他/更好的方法来实现此测试?

1 个答案:

答案 0 :(得分:0)

说真的,永远不要做这种模拟......如果你想测试超级电话试着找一个你可以检查的超级行为。

如果你没有找到任何其他方式,或者你有一些神秘的理由来检查它(我过去做过但我记不起为什么......也许我做错了)你可以把它包起来:< / p>

@mock.patch("mocktest.Base.__init__", wraps=mocktest.Base.__init__)
def test_calls_init_routine_of_base(mock_super_init):
    Derived(1)
    assert mock_super_init.called

如果您确实需要避免超级调用(例如,您从某个启动线程或访问某些远程资源的内容派生),您应该修补所需的属性:

@mock.patch("mocktest.Base.a", create=True)
@mock.patch("mocktest.Base.__init__")
def test_calls_init_routine_of_base(mock_super_init):
    Derived(1)