2012-12-26 10 views
29

devo unittest codice come il seguente:Python unittest - setUpClass() mi dà problemi - perché non posso ereditare in questo modo?

import unittest 

class MyUnitTest(unittest.TestCase): 
    def setUpClass(self): 
     do_something_expensive_for_all_sets_of_tests() 

class MyFirstSetOfTests(MyUnitTest): 
    def setUpClass(self): 
     super(MyFirstSetOfTests, self).setUpClass() 
     do_something_expensive_for_just_these_first_tests() 

    def test_one(self): 
     ... 

    def test_two(self): 
     ... 

class MySecondSetOfTests(MyUnitTest): 
    def setUpClass(self): 
     super(MySecondSetOfTests, self).setUpClass() 
     do_something_expensive_for_just_these_second_tests() 

    def test_one(self): 
     ... 

    def test_two(self): 
     ... 

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

Quando provo a eseguire questo codice, ottengo un errore come questo:

====================================================================== 
ERROR: setUpClass (__main__.MyFirstSetOfTests) 
---------------------------------------------------------------------- 
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead) 

---------------------------------------------------------------------- 

risposta

48

setUpClassdeve essere un metodo di classe. Da documentation:

Un metodo di classe chiamato prima dei test in una singola esecuzione di classe. setUpClass si chiama con la classe come unico argomento e deve essere decorata come un classmethod():

@classmethod def setUpClass (CLS): ...

Vedere Class and Module Fixtures per maggiori dettagli.

La versione manca il @classmethod decoratore:

class MyUnitTest(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     do_something_expensive_for_all_sets_of_tests() 

class MyFirstSetOfTests(MyUnitTest): 
    @classmethod 
    def setUpClass(cls): 
     super(MyFirstSetOfTests, cls).setUpClass() 
     do_something_expensive_for_just_these_first_tests() 

L'errore viene generato perché MyFirstSetOfTests.setUpClass() è chiamato sul classe, non su un caso, ma non ha contrassegnare il metodo come classmethod e quindi non è stato passato nell'argomento automatico self.

Problemi correlati