我想知道,当对具有多重继承的类运行unittest
/ setUp()
方法时,tearDown()
有什么特别的作用。
以下面的示例:
import unittest
class Foo:
def __init__(self, foo):
self._foo = foo
@property
def foo(self):
return self._foo
class TestsBase(unittest.TestCase):
def setUp(self):
super().setUp()
self.base_value = 1
class TestsMixin:
def setUp(self):
super().setUp()
self.expected_value = 1
class TestCase1(TestsMixin, TestsBase):
def test_base_value_is_equal_to_expected_value(self):
foo = Foo(self.base_value)
self.assertEqual(foo.foo, self.expected_value)
class TestCase2(TestsBase, TestsMixin):
def test_base_value_is_equal_to_expected_value(self):
foo = Foo(self.base_value)
self.assertEqual(foo.foo, self.expected_value)
if __name__ == '__main__':
unittest.main()
运行此代码时,TestCase1
类测试将成功,而TestCase2
测试将失败,并指出AttributeError: 'TestCase2' object has no attribute 'expected_value'
。
[现在,我了解MRO的工作原理,并且了解为什么显示此错误,但令我感到困惑的是,为什么TestCase1
没有相同的问题?毕竟,是否不使用setUp()
中的TestsMixin
方法而跳过setUp()
中的TestsBase
?
[我的结论是,unittest
模块必须为此做一些工作。有谁知道什么/如何?
提前感谢。
我已经找到了自己问题的答案。最后,一切都取决于MRO。
对于我的示例,MRO看起来像这样:
对于TestCase1:
- TestCase1
- TestsMixin
- TestsBase
- unittest.TestCase
- object
对于TestCase2:
- TestCase2
- TestsBase
- unittest.TestCase
- TestsMixin
- object
问题是,unittest.TestCase
在其自己的super().setUp()
调用中执行了[[not调用setUp()
。
object
没有setUp()
。通过在unittest.TestCase()
例程中添加以下代码,可以很容易地绕过setUp()
:>
def setUp(self):
parent = super()
if hasattr(parent, 'setUp'):
parent.setUp()
并且有效。但这显示了另一个问题。现在,我的停止工作。我将不得不在所有可能的mixin中添加此保护代码,这并不理想。因此,更好的解决方案是将其保持原样,并确保您在TestsMixin
因完全相同的原因
之前
基础中列出您的mixins。