我正在使用python进行测试,我问自己如何测试这种方法。
def get_response(self, url, params):
encoded_params = urllib.urlencode(params)
request = urllib2.Request(BASE_URL, headers=HEADERS)
response = urllib2.urlopen(request, encoded_params)
return response
使用doctest或unittest,如何最好地实现这一目标?我想过传递get_response()
一个测试网址和一些测试参数,它们存在于现实世界中并检查response.read()
是否返回了预期的数据。但不知怎的,我觉得,这不是它应该做的方式。有什么建议?我很感激建议如何在发短信的情况下处理这种情况。
答案 0 :(得分:5)
这是使用假对象的好例子:
# my_module
get_url = urllib2.urlopen
def get_response(self, url, params):
encoded_params = urllib.urlencode(params)
request = urllib2.Request(BASE_URL, headers=HEADERS)
response = get_url(request, encoded_params)
return response
# test_my_module
def fake_get_url(request, params):
assert request == "the url I expect"
assert params == ['the', 'params', 'i', 'expect']
return SomeFakeResponse("OK")
my_module.get_url = fake_get_url
assert my_module.get_response("blah", "blah").content == "OK"
这只是如何用你自己的假实现来覆盖真正的urllib2.urlopen函数来测试你的代码而不是真正访问网页的最简单的草图。
答案 1 :(得分:3)
这是使用模拟测试框架的好机会,例如minimock。
BASE_URL='http://google.com'
HEADERS = {"accept-language":"klingon"}
import urllib, urllib2
def get_response(self, url, params):
r"""
>>> from minimock import Mock
>>> urllib2.Request = Mock('urllib2.Request')
>>> urllib2.urlopen = Mock('urllib2.urlopen')
>>> get_response(None, 'http://google.com', {'foo':'bar'})
Called urllib2.Request(
'http://google.com',
headers={'accept-language': 'klingon'})
Called urllib2.urlopen(None, 'foo=bar')
>>>
"""
encoded_params = urllib.urlencode(params)
request = urllib2.Request(BASE_URL, headers=HEADERS)
response = urllib2.urlopen(request, encoded_params)
return response
请注意,该单元嵌入在doctest格式的被测函数的docstring中。