2014-03-30 3 views
3

파이썬에서 mock을 사용하면 최상위 패키지 (argparse와 같은)를 완전히 패치 할 수 없습니다. 아마도 패치에 대한 참조가 없기 때문일 수 있습니다. 한 가지 해결책은 모든 개별 호출을 패키지 (argparse.ArgumentParser와 같은)로 패치하는 것입니다. 이론 상으로는 패키지에 대한 호출이 유닛 테스트 중에 실수로 호출을 불러올 수있는 해당 패치없이 추가 된 경우파이썬 모의 패치 최상위 패키지

해결 방법이 모두 불편하지는 않지만 argparse와 같은 패키지를 완전히 패치하는 것이 이상적입니다. mock_open__main__.open을 사용하여 open()에 내장 된 것을 패치하기 위해 일부 속임수를 사용하는 것처럼 보입니다. 어떻게 작동하며 비슷한 수준의 헛소리가 최상위 패키지를 패치하는 데 사용될 수 있습니까? mock_open 패치에 관해서는

답변

3
import unittest.mock as mock 

mock_argparse = mock.Mock() 
with mock.patch.dict('sys.modules', argparse=mock_argparse): 
    import argparse 
    print(argparse.ArgumentParser()) 
# <Mock name='mock.ArgumentParser()' id='140681471282448'> 

은 :이 생성처럼

m = mock_open() 
with patch('__main__.open', m, create=True): 

보인다 __main__.open 그림자 모의 객체 속성 내장 된 버전 당신이 당신의 모듈에 open() 기능을 정의하는 것처럼. 실제 테스트를 위해 module_x.open() 패치를해야 겠지만, "module_x"는 실제로 open()을 호출하는 모듈입니다.