2012-07-05 3 views
16

내가 샘플 코드의 다음 부분에서 작업 mock.patch를 얻기 위해 노력하고 있어요에서 import 문 :에서 모의 ​​패치/파이썬

d: defaultdict(None, {}) 

가 어떤 의미 :

from mock import patch 
from collections import defaultdict 

with patch('collections.defaultdict'): 
    d = defaultdict() 
    print 'd:', d 

이 기능은 다음 출력 그 defaultdict는 패치되지 않았습니다.

나는 그것이 작동 직선 import 문으로에서/가져 오기 문을 교체하는 경우 :

from mock import patch 
import collections 

with patch('collections.defaultdict'): 
d = collections.defaultdict() 
print 'd:', d 

출력은 다음과 같습니다/수입에서 사용하여 전화를 패치 할 수있는 방법이

d: <MagicMock name='defaultdict()' id='139953944084176'> 

있습니까? 당신이 가져온 모듈에 대한 뭔가를 조롱하는 경우

from mock import patch 
from collections import defaultdict 

with patch('__main__.defaultdict'): 
    d = defaultdict() 
    print 'd:', d 

그러나, 당신이 원하는 것 : 동일한 모듈에 뭔가를 패치하는 경우가 __main__ 사용할 수

답변

21

감사합니다 올바른 참조 (또는 이름) 패치 있도록 해당 모듈의 이름을 사용합니다 : 여기

# foo.py 

from collections import defaultdict 

def bar(): 
    return defaultdict() 


# foo_test.py  

from mock import patch 
from foo import bar 

with patch('foo.defaultdict'): 
    print bar() 

점은 패치가 패치 된 것은 전체 경로를 원하는 것입니다. 이것은 사람들이 종종 __main__을 사용하지 않기 때문에 (또는 현재 모듈을 참조해야하기 때문에) 현재 모듈에서 무언가를 패치 할 때 약간 이상하게 보입니다.

7

patch이름이 인 패치로 작동합니다. 로컬 이름 공간에서 defaultdict이라는 이름을 사용하여 객체에 액세스하는 경우 이름 collections.defaultdict을 패치하면 아무 것도 얻을 수 없습니다. http://www.voidspace.org.uk/python/mock/patch.html#id1의 설명서를 참조하십시오.

+3

'from X import Y' 또는'X.Y import '를 사용하는지 여부에 대한 구현 세부 사항을 변경하면 단위 테스트가 조용하게 매우 다르게 작동하기 시작하지 않습니다. – detly

+0

@detly : 나는 그것이 사실이라는 것을 믿습니다.하지만 저는 모의에 익숙하지 않아서 경험으로 말할 수는 없습니다. – BrenBarn

+0

@detly 예, 맞습니다. – Daenyth