我目前正在使用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
正在拦截但导致管道损坏。
我该如何解决这个问题?
答案 0 :(得分:5)
我是VCR.py的作者。我想我可能已经修复了阻止VCR使用您正在使用的flickr API库的错误。尝试在fix-flickr-api branch中安装该版本,并告诉我这是否适合您。
答案 1 :(得分:1)
这类功能有很多库,结帐Mock
但看起来你正在寻找类似于FakeWeb的东西所以我会结账HTTPretty
看到你已经尝试过HTTPretty。我会模拟flickr_api所做的方法调用,并让它返回一个具有你期望的有效负载的存根。
古德勒克。
答案 2 :(得分:1)
为什么不编写一个简单的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()
会在屏幕上打印请求的环境(请求方法,网址等内容)。您也可以非常简单地打印请求正文等。
在您的flickr应用程序中,只需将localhost:8080替换为URL,然后向您自己的计算机发出请求。