2014-10-30 5 views
2

간단한 단위 테스트를 실행할 때 클래스 내부에서 테스트를 유지하는 것이 더 쉬울 수도 있습니다. 그러나 현재 모듈을 다시로드하는 방법을 모르므로 필요할 때마다 테스트를 별도의 모듈로 옮겨야합니다. 이 문제를 해결할 방법이 있습니까? 더 좋은 방법이 있다면unittesting 할 때 현재 모듈 다시로드

module: foo 
import unittest 

class MyObject 
... 

class MockMyObject 
... 

class TestMock(unittest.TestCase): 

    def setUp(self): 
     MyObject = MockMyObject 
     mocked = MyObject() 

    def tearDown(self): 
     reload(foo) # what goes here? 

    def testFunction(self): 
     mocked.do_mocked_function() 

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

나는 이것이 tearDown 방법 import sysreload(sys.modules[__name__])이다 처리하기 위해 찾은 방법,하지만 난 궁금하네요.

답변

2

원래 클래스를 변수에 저장하고 tearDown 함수로 복원 할 수 있습니다. 은`tearDown` 방법은 아무것도하지 않는이 경우

class TestMock(unittest.TestCase): 

    original = MyObject 

    def setUp(self): 
     global MyObject 
     MyObject = MockMyObject 

    def tearDown(self): 
     global MyObject 
     MyObject = TestMock.original 

    def testFunction(self): 
     MyObject().do_mocked_function() 
+0

정말 고마워. 그리고'글로벌'부분을 지적하기 위해서. –

+0

당신을 진심으로 환영합니다. – friedi

1

모듈을 다시로드하는 것은 좋지 않습니다.

class TestMock(unittest.TestCase): 

def setUp(self): 
    MyObject = MockMyObject 
    self.mocked = MyObject() 

def tearDown(self): 
    pass 

def testFunction(self): 
    self.mocked.do_mocked_function() 
+0

:
다음은 예입니다. 그리고 만약 하나 이상의 테스트가 있다면'MockMyObject'에 대한 패치 된 변경 사항은'reload'로 피하려고하는 것들 사이에서 지속될 것입니다. –

+0

모든 테스트 케이스는 먼저 setUp 메소드를 실행하고 MyObject의 새로운'self.mocked' 오브젝트가 생길 것입니다. – liaofeng

관련 문제