TestCase和mixin类的setUp()/ tearDown()方法的继承顺序

问题描述 投票:0回答:1

我想知道,当对具有多重继承的类运行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模块必须为此做一些工作。有谁知道什么/如何?

提前感谢。

python unit-testing multiple-inheritance
1个回答
0
投票

我已经找到了自己问题的答案。最后,一切都取决于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()

并且有效。但这显示了另一个问题。现在,我的TestsMixin

完全相同的原因

停止工作。我将不得不在所有可能的mixin中添加此保护代码,这并不理想。因此,更好的解决方案是将其保持原样,并确保您在

之前

基础中列出您的mixins。
© www.soinside.com 2019 - 2024. All rights reserved.