2012-06-22 2 views
3

테스트를 위해 클래스를 패치하는 데 문제가 있습니다. 저는 Scrapy에 속하는 것을 패치하려고합니다 - HtmlXpathSelector 클래스입니다.모의 라이브러리를 사용하여 Python 클래스를 패치하는 방법

from scrapy.selector import HtmlXPathSelector 
from mock import MagicMock, patch 

with patch('scrapy.selector.HtmlXPathSelector') as MockHtml: 
    instance = MockHtml.return_value 
    instance.method.return_value = 'foo' 
    example = HtmlXPathSelector() 
    print type(example) 
    assert example is instance 
    assert example.method == 'foo' 

결과가 :

<class 'scrapy.selector.lxmlsel.HtmlXPathSelector'> 
Traceback (most recent call last): 
    File "<stdin>", line 6, in <module> 
AssertionError 
>>> 

이 예에서는 모의 라이브러리 튜토리얼 것과 같은 여기에 가까워

일부 코드이다. 왜 그것이 작동하지 않는지 아는가?

답변

6

현재 테스트 코드에서 가져온 클래스를 패치하지 않아야합니다. 대신 해당 모듈 (테스트하려는 클래스)에 클래스를 패치해야합니다. HtmlXPathSelectormymodule에 가져온다면, 당신은 패치됩니다

with patch('mymodule.HtmlXPathSelector') as MockClass: 
    ... 

더 자세한 내용은 where to patch를 참조하십시오.

편집 당신이 정말이 필요한 경우, 당신은 함께 현재 모듈에서 클래스를 패치 할 수 있습니다 :

with patch('__main__.Class') as MockClass: 
+0

아! 이것이 내가 원하는 것입니다 ... 지금 당장이 접근법은 네드의 대답에 대한 제 의견에 답해줍니다. 감사! – Edwardr

+0

momemnt의 패치는 503을 반환합니다. – Drachenfels

+0

@Drachenfels 고마워요, readthedocs를 가리키는 링크가 더 안정적이어야합니다. – schlamar

2

은 코드 샘플 두 가지 문제가있다. 첫 번째는 scrapy 모듈에서 HtmlXPathSelector를 가져온 다음 사실 이후에 이름을 변경한다는 것입니다. 가져 오기 선택하는 대신, 거기에서 이름을 사용

from scrapy import selector 
from mock import MagicMock, patch 

with patch('scrapy.selector.HtmlXPathSelector') as MockHtml: 
    instance = MockHtml.return_value 
    instance.method.return_value = 'foo' 
    example = selector.HtmlXPathSelector() 
    print type(example) 
    assert example is instance 
    assert example.method() == 'foo' 

다른 문제는 당신의 마지막 줄 method 확인되었다, 그것은 method()로 메소드를 호출해야 할 때.

+0

감사합니다. 유일한 문제는, 내 질문에 준 예제는 약간 단순화 된 것입니다. 현실은 모듈에서'mypackage.foo_module','HtmlXPathSelector'를 다음과 같이 가져온 것입니다 :'from scrapy.selector import HtmlXPathSelector', 그리고 테스트하고있는 함수는'hxs = HtmlXPathSelector (XX)'와 같은 인스턴스화를가집니다. 모든 것을 작동 시키려면 테스트 할 클래스의 코드를 변경해야합니까? – Edwardr

+0

제품 코드를 변경하여이 샘플이 가져 오는 방식을 가져 오거나,'patch ('mypackage.foo_module.HtmlXPathSelector')'를 사용하십시오. 이 두 번째 방법은 현지화 된 변경 사항이므로 더 나은 방법입니다. –

+0

나는 그것을 얻는다, Ned, 고마워. 오히려 serendipitously 나는 당신의 대화를 http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2010-tests-and-testability-188-3280697로 듣고있었습니다. 그리고 나서 당신은 내 시험 문제에 답했습니다. 얼마나 이상한 지. :-) – Edwardr

관련 문제