fixture dans urllib.request

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

Recommended Posts

fixture dans urllib.request
urllib.request