我想测试在以下场景中是否在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'
我该怎样防止这种情况?在这种情况下是否有其他/更好的方法来实现此测试?
答案 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)