В Python есть ли какие-нибудь библиотеки, которые высмеивают ответы для httplib?

В настоящее время я использую python_flickr_api для загрузки фотографий для моего приложения: оно использует httplib выполнить многочастный POST-запрос.

Проблема: я хочу убедиться, что выгрузка действительно выполняется в интеграционном тесте, перехватывая запрос POST и создавая заранее определенный успешный ответ, чтобы мои тесты могли работать полностью в автономном режиме и не зависеть от Flickr (я не хочу загружать одно и то же тестовое изображение 100 раз!)

С этой целью я попытался использовать две невероятные библиотеки: VCRPy и HTTPretty. Ни один из них не решает мою проблему, потому что ни один из них не поддерживает httplib (HTTPretty идет ближе всего, с поддержкой httplib2 только), и я получаю ошибку, которая выглядит примерно так:

 Failure/Error: [Errno 32] Broken pipe

 Traceback:
 ...
 File "/usr/local/lib/python2.7/site-packages/flickr_api/upload.py", line 92, in upload
     r = post(UPLOAD_URL,auth.AUTH_HANDLER,args,photo_file)
 File "/usr/local/lib/python2.7/site-packages/flickr_api/upload.py", line 52, in post
     r = multipart.posturl(url,fields,files)
 File "/usr/local/lib/python2.7/site-packages/flickr_api/multipart.py", line 19, in posturl
     return post_multipart(urlparts[1], urlparts[2], fields,files)
 File "/usr/local/lib/python2.7/site-packages/flickr_api/multipart.py", line 33, in post_multipart
     h.send(body)
 File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 805, in send
     self.sock.sendall(data)
 File "/usr/local/lib/python2.7/site-packages/httpretty/core.py", line 243, in sendall
     return self._true_sendall(data)
 File "/usr/local/lib/python2.7/site-packages/httpretty/core.py", line 216, in _true_sendall
     self.truesock.sendall(data, *args, **kw)
 File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
     return getattr(self._sock,name)(*args)

Так ясно httpretty перехватывает, но вызывает сломанную трубу.

Как я могу это исправить?

3 ответа

Я автор VCR.py. Я думаю, что, возможно, я исправил ошибку, препятствующую работе видеомагнитофона с библиотекой API flickr, которую вы используете. Попробуйте установить версию в ветке fix-flickr-api и дайте мне знать, если это работает для вас.

Есть множество библиотек для этого типа функциональности.

Но похоже, что вы ищете что-то похожее на FakeWeb, поэтому я хотел бы проверить HTTPretty

Видя, как вы уже попробовали HTTPretty. Я бы смоделировал вызов метода, который делает flickr_api, и дал бы ему вернуть заглушку с ожидаемой полезной нагрузкой.

Удачи.

Почему бы вам не написать простой сервер WSGI, который печатает то, что вам нужно?

Например, следующий код (используется только стандартная библиотека Python):

def application(environ, start_response):
    print environ
    status = "200 OK"
    headers = [("Content-Type", "text/plain"),
               ("Content-Length", "0")]
    start_response(status, headers)
    return ""

if __name__ == "__main__":
    from wsgiref.simple_server import make_server
    httpd = make_server("localhost", 8080, application)
    httpd.serve_forever()

выведет на экран среду запроса (например, метод запроса, URL и т. д.). Вы также можете очень просто напечатать тело запроса и т. Д.

В вашем приложении flickr просто замените URL на localhost:8080 и отправляйте запросы на ваш собственный компьютер.

Другие вопросы по тегам