2016-01-22 63 views
0

我根本就没有足够的有经验的Python面向对象编程知道如何做到这一点:如果我有几个班是一个unittest.TestCase子类的子类。当后者调用这些方法时,超类的方法应该如何引用子类的变量?让我来试试这个来说明吧,可能是错误的,例如:现在Python(unittest)超类方法应该如何在其调用子类中引用一个变量?

import unittest 

class TestSuper(unittest.TestCase): 

    def test_method(self): 
     # do something, e.g. 
     pass 

class TestSub1(TestSuper): 

    def setUp(self): 
     self.some_parameter = 1 

class TestSub2(TestSuper): 

    def setUp(self): 
     self.some_parameter = 2 

if __name__ == '__main__': 
    unittest.main() 

,我无法弄清楚如何correcty参考TestSub1.parameterTestSub2.parameter,分别在TestSuper.test_method从子类调用。

我被https://stackoverflow.com/a/25695512/865169的启发,但在这里我想实现有多个测试用例做同样的,但只有在它们的设置不同。我当然可以通过复制粘贴我的测试用例定义来实现所有这些,但是我发现这种错误的编码习惯。

回答

2

只需使用self.some_parameter; self总是绑定到这里的正确实例。

然而,考虑到unittest.main()将运行*所有三个测试案例(包括基类)test_method,所以你必须为some_parameter基类提供一个默认值。

如果您不希望TestSuper被视为测试用例,请不要从unittest.TestCase继承。使用它作为一个mix-in来代替:

import unittest 

class TestMixin(object): 
    def test_method(self): 
     # do something, e.g. 
     pass 

class TestSub1(unittest.TestCase, TestMixin): 
    def setUp(self): 
     self.some_parameter = 1 

class TestSub2(unittest.TestCase, TestMixin): 
    def setUp(self): 
     self.some_parameter = 2 

if __name__ == '__main__': 
    unittest.main() 

现在unittest.main()只能找到测试用例(TestSub1TestSub2),只有在这种情况下运行test_method

+0

好吧,我有点害怕混入方法由于http://nedbatchelder.com/blog/201210/multiple_inheritance_is_hard.html –

+0

@瓦迪姆-P显示隐藏非TestCase类中的基类,以跳过测试在基类:http://stackoverflow.com/a/25695512/865169 –

+0

@ThomasArildsen:你是不是在提供一个基地,一个mixin同样的方法。正确使用mixins并不难。另请参阅https://www.youtube.com/watch?v=EiOglTERPEo,了解有关多重继承的详细说明。 –

相关问题