Порядок наследования для методов setUp () / tearDown () для классов TestCase и mixin - PullRequest
0 голосов
/ 30 октября 2019

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

Заранее спасибо.

...