Как вы тестируете функцию, используя которую извлекает данные по urllib2? - PullRequest
7 голосов
/ 16 июля 2011

Я вхожу в тестирование на 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() ожидаемые данные.Но почему-то я чувствую, что это не так, как должно быть.Какие-либо предложения?Буду признателен за предложения, как обращаться с такими случаями в контексте текстовых сообщений.

Ответы [ 2 ]

5 голосов
/ 16 июля 2011

Это хороший пример использования поддельных объектов:

# 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 собственной ложной реализацией, чтобы протестировать свой код, не обращаясь к Интернету.

3 голосов
/ 16 июля 2011

Это хорошая возможность использовать фреймворк для тестирования, такой как 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 .

...