2010-12-20 2 views
2

다른 패키지에 대한 소프트 종속성이있는 패키지 중 일부는 기본 (간단한) 구현으로 폴백합니다.Python에서 특정 라이브러리가없는 상황을 테스트하는 방법

문제는 단위 테스트를 사용하여 테스트하기가 매우 어렵다는 것입니다. 별도의 가상 환경을 설정할 수는 있지만 관리가 어렵습니다.

패키지 또는 다음을 달성 할 수있는 방법이 있나요 일 : ImportError를 인상 할

import X 

평소와 같이 작동하지만

hide_package('X') 
import X 

있습니다.

코드를 테스트하기가 어렵 기 때문에 코드의 후위 부분에 버그가 생기고 있습니다.

답변

2

그것은 조금 더러운 보이는,하지만 당신은 __import__ 내장 재정의 할 수 있습니다 : 당신은 PEP (302) 읽고, BTW

save_import = __builtin__.__import__ 
def my_import(name, *rest): 
    if name=="hidden": 
     raise ImportError, "Hidden package" 
    return save_import(name, *rest) 
__builtin__.__import__ = my_import 

를? 가져 오기 후크를 사용하면 더 강력한 메커니즘을 만들 수있는 것 같습니다.

+0

이것은 프로덕션 코드가 아닌 테스트 용이므로 파이썬의 내부를 만지는 것은 괜찮습니다. 감사! – luispedro

2

특히 패키지를 다른 디렉토리/zip 파일에 설치하는 경우 (예 : 달걀을 사용하는 경우) sys.path를 편집하는 것이 좋습니다. 가져 오기 전에 sys.path에서 원하지 않는 것을 삭제하십시오.

가능하지 않은 경우 (모든 구성 요소가 단일 sys.path 항목에 있기 때문에) 패키지 자체에 대한 해킹을 해킹 할 수 있습니다. 예 : (sys 모듈에 패치 환경, 또는 무언가) 전역 변수 가져 오기 당신이 실패 할 패키지 목록이 있습니다

# X.py 
import sys 
if 'X' in sys.suppressed_packages: 
    raise ImportError, 'X is suppressed' 

:

sys.suppressed_packages=set() 
sys.suppressed_packages.add('X') 

그런를, 각 패키지에 명시 적으로 ImportError를 인상 물론 sys 모듈을 사용하는 대신 hide_package 함수와 함께 자체 인프라를 만들 수 있습니다.

관련 문제