J'ai cherché HTTPretty parce qu'il ne fonctionnait pas avec python3.3 ```urllib.request.urlopen () `` `. Il y avait une source à laquelle j'ai fait référence, mais j'ai oublié quelque part ... La procédure est la suivante. Si vous utilisez urllib2, python2 convient probablement.
Préparation
from io import StringIO
import urllib.request as urllib2
def generate_response(req, return_data):
resp = urllib2.addinfourl(StringIO(return_data),
'mock header',
req.get_full_url())
resp.code = 200
resp.msg = 'OK'
return resp
expect_url = {}
def register(url, return_data):
expect_url[url] = lambda req:generate_response(req, return_data)
def mock_response(req):
return expect_url[req.get_full_url()](req)
class MyHTTPHandler(urllib2.HTTPHandler):
def http_open(self, req):
return mock_response(req)
Faites-le avec install_opener. Il ne vous reste plus qu'à mettre l'URL à pirater et la valeur de retour dans expect_url.
Corps de test
from nose.tools import *
class TestUrlopen(object):
def __init__(self):
my_opener = urllib2.build_opener(MyHTTPHandler)
urllib2.install_opener(my_opener)
def test_urlopen(self):
url = 'http://mock_server'
register(url, "hello world")
ret = urllib2.urlopen(url).read()
eq_(ret, "hello world")
C'est mon idée de mettre expect_url dans global et d'ajouter une réponse dynamique, mais les autres sont à peu près codés. Où était-il ...
Je ne l'ai pas fait ici, mais si vous voulez retourner des données différentes (avec des effets secondaires) à la même URL, appuyez avec register () et pop avec mock_response ().
J'ai essayé de faire un cours d'une manière ou d'une autre. https://gist.github.com/norobust/8254063