如何在Python单元测试中模拟外部服务器?
问题描述:
我有需要很长的时间(分钟)几个单元测试,因为调用外部服务(推特,脸谱,Klout的,等等)如何在Python单元测试中模拟外部服务器?
我想缓存来自这些服务的结果,并透明地为他们提供服务的,只需对我目前的测试进行微小的更改。缓存键取决于URL,查询参数,标题等,因此它非常复杂。
这样做的最好方法是什么?
答
从技术上讲,如果它使用外部服务,它不是一个单元测试,而是一个集成测试。对于单元测试并加快你的测试代码使用模拟对象。你可以在这里找到有关python模拟对象的详细信息:
http://python-mock.sourceforge.net/
答
继承人的代码,我们使用请求库来调用外部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')
+1模拟。我也认为这是我尝试过的最好的。 – user37078 2011-04-06 13:28:01