Python TestCase和mixin类的setUp()/tearDown()方法的继承顺序
我想知道,Python TestCase和mixin类的setUp()/tearDown()方法的继承顺序,python,unit-testing,multiple-inheritance,Python,Unit Testing,Multiple Inheritance,我想知道,unittest在为具有多重继承的类运行setUp()/tearDown()方法时做了什么特殊的事情 以以下为例: 导入单元测试 Foo类: 定义初始化(self,foo): self.\u foo=foo @财产 def foo(self): 回归自我 类TestsBase(unittest.TestCase): def设置(自): super().setUp() self.base_值=1 类TestsMixin: def设置(自): super().setUp() self.ex
unittest
在为具有多重继承的类运行setUp()
/tearDown()
方法时做了什么特殊的事情
以以下为例:
导入单元测试
Foo类:
定义初始化(self,foo):
self.\u foo=foo
@财产
def foo(self):
回归自我
类TestsBase(unittest.TestCase):
def设置(自):
super().setUp()
self.base_值=1
类TestsMixin:
def设置(自):
super().setUp()
self.expected_值=1
类TestCase1(TestsMixin,TestsBase):
def测试基本值等于预期值(自身):
foo=foo(自基值)
self.assertEqual(foo.foo,self.expected\u值)
类TestCase2(TestsBase,TestsMixin):
def测试基本值等于预期值(自身):
foo=foo(自基值)
self.assertEqual(foo.foo,self.expected\u值)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
运行此代码时,TestCase1
类测试将成功,而TestCase2
测试将失败,原因是AttributeError:“TestCase2”对象没有属性“预期值”
现在,我明白了MRO是如何工作的,我也明白了为什么会出现这个错误,但让我困惑的是,为什么TestCase1
没有同样的问题?毕竟,难道不会使用TestsMixin
中的setUp()
方法,而跳过TestsBase
中的setUp()
吗
我的结论是,unittest
模块必须要做些什么才能让它工作。有人知道怎么做吗
提前谢谢。我已经找到了我自己问题的答案。最后,一切都归结于MRO 例如,MRO如下所示: 对于TestCase1:
- TestCase1
- TestsMixin
- TestsBase
- unittest.TestCase
- object
对于TestCase2:
- TestCase2
- TestsBase
- unittest.TestCase
- TestsMixin
- object
问题是,unittest.TestCase
在自己的setUp()
调用中不调用super().setUp()
原因很简单,object
没有setUp()
在unittest.TestCase()
中,通过在其setUp()
例程中添加以下代码,可以很容易地避免这种情况:
def setUp(self):
parent = super()
if hasattr(parent, 'setUp'):
parent.setUp()
它是有效的。但这表明了另一个问题。现在,我的TestsMixin
出于完全相同的原因停止工作。我必须在每个mixin中添加这个保护代码,这并不理想
因此,更好的解决方案是保持原样,并确保在你的基础之前列出你的混音