Ich habe nach HTTPretty gesucht, weil es mit python3.3 `urllib.request.urlopen ()`
nicht funktioniert hat. Es gab eine Quelle, die ich als Referenz verwendet habe, aber ich habe sie irgendwo vergessen ... Die Vorgehensweise ist wie folgt. Wenn Sie urllib2 verwenden, ist Python2 wahrscheinlich in Ordnung.
Vorbereitung
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)
Tun Sie dies mit install_opener. Jetzt müssen Sie nur noch die zu hackende URL und den Rückgabewert in expected_url eingeben.
Testkörper
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")
Es ist meine Idee, await_url global zu setzen und eine dynamische Antwort hinzuzufügen, aber die anderen sind ziemlich codiert. Wo war es ...
Ich habe es hier nicht getan, aber wenn Sie verschiedene Daten (mit Nebenwirkungen) unter derselben URL zurückgeben möchten, drücken Sie mit register () und pop mit mock_response ().
Ich habe irgendwie versucht, eine Klasse zu machen. https://gist.github.com/norobust/8254063