7

我开始在 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()一个测试 url 和一些测试参数,它们存在于现实世界中,并检查是否response.read()返回预期的数据。但不知何故,我觉得,这不是应该做的方式。有什么建议么?我将不胜感激有关如何在发短信的情况下处理此类情况的建议。

4

2 回答 2

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 函数以测试您的代码而无需真正访问网络的最粗略草图。

于 2011-07-15T21:09:28.180 回答
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格式嵌入在被测函数的文档字符串中。

于 2011-07-15T21:18:04.177 回答