2011-04-06 155 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') 
相关问题