我有以下构造,其中我从unittest.TestCase
派生了一个类,其中调用了一个在实际测试类MyTests
中定义的方法。
import unittest
class TestCase1(unittest.TestCase):
@classmethod
def setUpClass(cls):
print cls.extra()
class TestCase2(TestCase1):
@classmethod
def setUpClass(cls):
TestCase1.setUpClass()
class MyTests(TestCase1):
@classmethod
def extra(cls):
return 42
def test1(self):
pass
if __name__ == '__main__':
unittest.main()
上面的代码,按预期工作。当我执行测试时,setUpClass
运行TestCase1
,执行extra()
中定义的MyTests
。
当我想使用TestCase2
代替TestCase1
时,即当我在下一行中将'1'更改为'2'时,问题就会发挥作用:
class MyTests(TestCase2): # using TestCase2 instead
我们的想法是setUpClass
TestCase2
被调用,它本身从基本类调用setUpClass
,即TestCase1
,它执行方法extra
}。但是,我收到属性错误:
AttributeError: type object 'TestCase1' has no attribute 'extra'
我似乎在这里误解了一些概念。我希望我的代码在两种情况下都可以工作(可能存在一些错误),或者在两种情况下都失败。任何想法可能是错的或我如何解决问题都非常感谢。
答案 0 :(得分:2)
原因是,当它从TestCase2
继承时,调用cls
的{{1}}属于TestCase1.setUpClass()
类型,而TestCase1
没有extra()
}} 方法。从MyTests调用时,cls
是MyTests
的一个实例,它有一个额外的方法。
super
将cls
参数从MyTests.setUpClass(cls)
传递到TestCase1.setUpClass(cls)
。因此,当它达到TestCase1
时,cls
会有extra()
方法。
答案 1 :(得分:1)
我强烈建议您使用super代替TestCase1.setUpClass()
。