Мне было интересно, что особенное делает 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
должен что-то делать, чтобы это работало. У кого-нибудь есть идеи что / как?
Заранее спасибо.