2016-01-22 61 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,瞭解有關多重繼承的詳細說明。 –

相關問題