2011-07-15 18 views
7

Tôi đang đi vào thử nghiệm trong python và tôi tự hỏi mình làm thế nào để kiểm tra phương pháp này.Làm thế nào để bạn kiểm tra một hàm sử dụng truy xuất dữ liệu bằng urllib2?

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 

Sử dụng doctest hoặc unittest, cách tốt nhất đạt được điều này? Tôi đã nghĩ đến việc vượt qua get_response() url kiểm tra và một số thông số thử nghiệm tồn tại trong thế giới thực và để kiểm tra xem response.read() có trả về dữ liệu dự kiến ​​hay không. Nhưng bằng cách nào đó tôi cảm thấy, đây không phải là cách nó nên được thực hiện. Bất kỳ đề xuất? Tôi sẽ đánh giá cao các đề xuất làm thế nào để xử lý các trường hợp như vậy trong bối cảnh nhắn tin.

+0

Trước tiên, hãy xác định hợp đồng mà phương pháp phải tuân thủ. Bài đăng phác thảo thử nghiệm * phản hồi được chấp nhận *, nhưng bây giờ làm thế nào thất bại nên được xử lý. Tuy nhiên, thử nghiệm * dữ liệu * thực tế, nghe có vẻ giống một bài kiểm tra tích hợp hơn. –

+2

Hãy xem mã scikit-learning (BSD được cấp phép) thực hiện chính xác điều này; [testcases] (https://github.com/scikit-learn/scikit-learn/blob/master/scikits/learn/datasets/tests/test_mldata.py), ['mock_urllib2'] (https://github.com /scikit-learn/scikit-learn/blob/master/scikits/learn/utils/testing.py#L55). –

Trả lời

3

Đây là cơ hội tốt để sử dụng khung kiểm tra giả, chẳng hạn như 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 

Lưu ý rằng đơn vị được nhúng trong chuỗi tài liệu cho hàm đang thử nghiệm, ở định dạng doctest.

5

Đây là một trường hợp tốt cho việc sử dụng đối tượng giả:

# 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" 

Đây mới chỉ là phác thảo sketchiest về cách bạn có thể ghi đè lên các chức năng urllib2.urlopen thực với thực hiện giả của riêng bạn để kiểm tra mã của bạn mà không thực sự đánh Trang web.

Các vấn đề liên quan