2014-03-01 38 views
2

我正在困擾Python的模擬測試方法。Python單元測試模擬...模擬一個模塊語句

我想對this file做一些嘲弄。

由於包XBMC,xbmcaddon和xbmcgui不能在正常的Python環境中導入我已經成功地嘲笑它們像這樣:

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」(將其添加到模塊中的補丁安裝時創建的列表)我在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' 

所以我需要__addon__.getSetting()返回一個字符串得到一個類似的錯誤。

任何想法?

所有的嘗試都失敗了,但我不認爲我完全理解了模擬包的功能。

注意我關於Python 2.7.3與mock 1.0.1

+0

'__addon__'從哪裏來?如果你嘲笑了那個對象,你需要確保你爲getSetting()調用設置了一個返回值。 –

回答

1

你需要告訴你的嘲笑什麼返回。該__addon__值是xbmcaddon.Addon()調用的結果,這樣你就可以訪問到的模擬對象:

addon = self.xbmcaddon.Addon.return_value 

因爲.return_value給你的實際Mock對象調用Addon()將返回。

現在你可以告訴Mock對象調用getSetting()方法時返回什麼;有兩個值在這裏提供,所以你可以使用side_effect設置值序列返回:

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

哪裏__addon__.getSetting()第一個電話會產生的第一個值'some_api_key',第二CAL會產生'42'

+0

感謝Martijn的工作。它仍然讓我頭疼,因爲它感覺我正在改變一個實例,它以某種方式改變了類定義本身。 – powlo