我有一段代码不知道如何进行单元测试!该模块使用 urllib2 从外部 XML 提要(twitter、flickr、youtube 等)中提取内容。这是它的一些伪代码:
params = (url, urlencode(data),) if data else (url,)
req = Request(*params)
response = urlopen(req)
#check headers, content-length, etc...
#parse the response XML with lxml...
我的第一个想法是腌制响应并加载它以进行测试,但显然 urllib 的响应对象是不可序列化的(它会引发异常)。
仅从响应正文中保存 XML 并不理想,因为我的代码也使用了 header 信息。它旨在作用于响应对象。
当然,在单元测试中依赖外部数据源是一个可怕的想法。
那么我该如何为此编写单元测试呢?
最佳答案
urllib2 有一个名为 build_opener()
和 install_opener()
的函数,您应该使用它们来模拟 urlopen()
import urllib2
from StringIO import StringIO
def mock_response(req):
if req.get_full_url() == "http://example.com":
resp = urllib2.addinfourl(StringIO("mock file"), "mock message", req.get_full_url())
resp.code = 200
resp.msg = "OK"
return resp
class MyHTTPHandler(urllib2.HTTPHandler):
def http_open(self, req):
print "mock opener"
return mock_response(req)
my_opener = urllib2.build_opener(MyHTTPHandler)
urllib2.install_opener(my_opener)
response=urllib2.urlopen("http://example.com")
print response.read()
print response.code
print response.msg
关于python - 如何对依赖 urllib2 的模块进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276689/