3

我目前正在使用python_flickr_api为我的应用上传照片:它用于httplib执行多部分 POST 请求。

问题:我想通过拦截 POST 请求并创建预先设置的成功响应来验证上传确实是在集成测试中发出的,以便我的测试可以完全离线运行而不依赖于 Flickr(我不想上传相同的测试图像 100 次,要么!)

为此,我尝试使用两个令人难以置信的库:VCRPyHTTPretty。它们都没有解决我的问题,因为它们都不支持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正在拦截,但正在导致管道破裂。

我怎样才能解决这个问题?

4

3 回答 3

5

我是VCR.py的作者。我想我可能已经修复了阻止 VCR 使用您正在使用的 flickr API 库的错误。尝试在fix-flickr-api 分支中安装该版本,让我知道这是否适合您。

于 2013-09-15T21:07:53.163 回答
1

有大量此类功能的库,请查看Mock

但看起来你正在寻找类似于 FakeWeb 的东西,所以我会检查HTTPretty

看来您已经尝试过 HTTPretty。我会模拟 flickr_api 进行的方法调用,并让它返回一个包含您期望的有效负载的存根。

祝你好运。

于 2013-09-15T16:32:16.817 回答
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()

将在屏幕上打印请求的环境(请求方法、url 等内容)。您也可以非常简单地打印请求正文等。

在您的 flickr 应用程序中,只需将 URL 替换为 localhost:8080 并向您自己的计算机发出请求。

于 2013-09-15T16:42:47.643 回答