2011-09-18 8 views
6

Wiele modułów Pythona zachowuje stan wewnętrzny bez definiowania klas, np. logging utrzymuje kilka rejestratorów dostępnych przez getLogger().Ponownie importuj moduł testowy w celu utraty kontekstu

Jak testujesz taki moduł?
Korzystając ze standardowych narzędzi, chciałbym, aby różne testy w klasie TestCase ponownie zaimportowały mój test podrzędny do modułu, tak aby za każdym razem tracił on swój kontekst. Czy można to zrobić?

Odpowiedz

7
import unittest 
import sys 

class Test(unittest.TestCase): 
    def tearDown(self): 
     try: 
      del sys.modules['logging'] 
     except KeyError: 
      pass 
    def test_logging(self): 
     import logging 
     logging.foo=1 
    def test_logging2(self): 
     import logging 
     print(logging.foo) 

if __name__ == '__main__': 
    unittest.sys.argv.insert(1,'--verbose') 
    unittest.main(argv = unittest.sys.argv)  

% test.py Test.test_logging przełęcze:

test_logging (__main__.Test) ... ok 

ale % test.py Test.test_logging2 nie:

test_logging2 (__main__.Test) ... ERROR 

, ponieważ stan wewnętrzny logging został zresetowany.

3

ten będzie ponownie zaimportować moduł jako nowy dla ciebie:

import sys 
del sys.modules['my_module'] 
import my_module 
+0

Myślę, że masz na myśli 'del sys.modules ['my_module']' –

+0

Yup - całkiem dobrze. Będę edytować odpowiedź. –