2011-04-06 192 views
11

我有需要很長的時間(分鐘)幾個單元測試,因爲調用外部服務(推特,臉譜,Klout的,等等)如何在Python單元測試中模擬外部服務器?

我想緩存來自這些服務的結果,並透明地爲他們提供服務的,只需對我目前的測試進行微小的更改。緩存鍵取決於URL,查詢參數,標題等,因此它非常複雜。

這樣做的最好方法是什麼?

回答

9

你會(應該)通常使用某種適配器連接到這些外部服務模塊。這些是您與外部世界的接口,可以根據情景創建和僞造響應。

我已經試驗了一些嘲諷庫,最後發現Mock是最適合我的一個。

+0

+1模擬。我也認爲這是我嘗試過的最好的。 – user37078 2011-04-06 13:28:01

2

從技術上講,如果它使用外部服務,它不是一個單元測試,而是一個集成測試。對於單元測試並加快你的測試代碼使用模擬對象。你可以在這裏找到有關python模擬對象的詳細信息:
http://python-mock.sourceforge.net/

3

繼承人的代碼,我們使用請求庫來調用外部API的。所以我們用模擬請求對象創建上下文處理器。

所以,如果我們在測試的GET_DATA功能,這將是我們如何嘲笑請求外部API:

import requests 
import mock 
import unittest 


def get_data(url): 
    resp = requests.get(url) 
    return resp 

class GetDataTest(unittest.TestCase): 

    def test_get_data(self): 
     with mock.patch.object(requests, 'get') as get_mock: 
      get_mock.return_value = mock_response = mock.Mock() 
      mock_response.status_code = 200 
      mock_response.content = {'twitter_handle': '@twitter'} 
      resp = get_data("http://this_address_does_not_exist.com") 
      self.assertEqual(resp.status_code, 200) 
      self.assertEqual(resp.content['twitter_handle'], '@twitter') 
相關問題