2014-03-01 4 views
2

파이썬의 모의 테스트 방법론을 뒤죽박죽으로 다루고 있습니다.Python unittest mock ... 모듈 선언문을 모의 처리합니다.

this file에 조롱하고 싶습니다. 패키지 XBMC, xbmcaddon 및 xbmcgui가 정상적인 파이썬 환경에서 가져올 수 없기 때문에

나는 이런 식으로 그들을 조롱 관리했습니다 :

class XBMCTestCase(unittest.TestCase):  
    def setUp(self): 
     #Mock up any calls to modules that cannot be imported 
     self.xbmc = Mock() 
     self.xbmcgui = Mock() 
     self.xbmcaddon = Mock() 

     modules = { 
      'xbmc' : self.xbmc, 
      'xbmcgui': self.xbmcgui, 
      'xbmcaddon': self.xbmcaddon 
      } 
     self.module_patcher = patch.dict('sys.modules', modules) #@UndefinedVariable 
     self.module_patcher.start() 

행동 here에서를 참조하십시오. 내가 setlocation.py을 가져올 때

그래서 나는 다음과 같은 오류가 발생합니다 :

File "/home/paulo/workspace/weather.metoffice/src/metoffice/utils/utilities.py", line 21, in <module> 
    CACHE_FOLDER = os.path.join(ADDON_DATA_PATH, 'cache') 
    File "/usr/lib/python2.7/posixpath.py", line 78, in join 
    path += b 
TypeError: unsupported operand type(s) for +=: 'Mock' and 'str' 

을 나는 'metoffice.utils를'(교체 아웃 조롱해도 설정에서 만든 패치 모듈 목록에 추가하여) 나는 그래서 문자열을 반환 __addon__.getSetting() 필요 setlocation.py

File "/home/paulo/workspace/weather.metoffice/src/metoffice/setlocation.py", line 32, in <module> 
    GEOIP_PROVIDER = int(__addon__.getSetting('GeoIPProvider')) 
TypeError: int() argument must be a string or a number, not 'Mock' 

에서 유사한 오류가 발생합니다.

아이디어가 있으십니까?

모든 시도가 실패했지만 모의 패키지의 기능을 완전히 이해하지 못했다고 생각합니다. 내가 mock 1.0.1

+0

'__addon__ '은 어디에서 왔습니까? 객체를 조롱했다면 getSetting() 호출의 반환 값을 설정해야합니다. –

답변

1

파이썬 2.7.3에있어

주 당신은 반환 할 것을 당신의 모의 객체를 말할 필요가있다. __addon__ 값은 당신이 그 모의 개체에 대한 액세스를 얻을 수 있도록하는 xbmcaddon.Addon() 호출의 결과입니다

addon = self.xbmcaddon.Addon.return_value 

.return_value 당신에게 Addon()를 호출하면 반환되는 실제 Mock 객체를 제공하기 때문이다.

getSetting() 메서드가 호출 될 때 Mock 개체의 결과를 알 수 있습니다. 여기 저기 제공하기 위해이 개 값은, 그래서 당신은 반환 값의 순서를 설정하는 side_effect을 사용할 수 __addon__.getSetting()에 대한 첫 번째 호출이 첫 번째 값 'some_api_key'을 생산합니다

addon.getSetting.side_effect = ['some_api_key', '42'] 

두 번째 칼이 '42'를 생성합니다.

+0

감사합니다 Martijn 그 작품. 그것은 여전히 ​​클래스 정의 자체를 변경하는 인스턴스를 변경하는 것처럼 느껴지기 때문에 여전히 상처를줍니다. – powlo