[PYTHON] Befestigung von urllib.request

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

Recommended Posts

Befestigung von urllib.request
urllib.request