python - 如何对依赖 urllib2 的模块进行单元测试?

标签 python unit-testing urllib2 urllib

我有一段代码不知道如何进行单元测试!该模块使用 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/

相关文章:

python - 如何让XPath选择具有相同id属性的多个表元素?

python - Flask-SQLAlchemy 集成测试找不到回滚更改的方法

Python - 对于 url,如何检查网络服务器是否可用或存在? (使困惑)

python - 在 python 中使用 urllib2 和 Tor 拒绝连接

python - 从 URL 读取 unicode 文本文件?

python - 将 x Axis 分成 2 个以上的部分 (Python)

字符串剥离后的 Python 不需要的空行

python - 使用用户代理 header 时 Webscraping CrunchBase 访问被拒绝

java - 如何模拟从类级别对象调用的方法

c++ - 我可以将多个 BOOST 单元测试链接到一个测试二进制文件中吗?