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

Test if super() was called during initialization gives AttributeError

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

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 class 在 super(Derived, self).__init(a) 之后用属性 a 做某事,例如如果我在调用 super() 之后放置一个 print(self.a),那么测试会抛出一个 AttributeError:

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

我该如何防止这种情况发生?在这种情况下是否有 other/better 种方法来实现这个测试?

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

如果你没有找到任何其他方法或者你有一些神秘的原因来检查它(我以前做过但我不记得为什么......也许我做错了)你可以把它包起来:

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