【发布时间】:2013-09-15 16:12:48
【问题描述】:
我目前正在使用 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 正在拦截但导致管道损坏。
我该如何解决这个问题?
【问题讨论】:
-
我想继续使用
flickr_api来实现这个功能,因为它为我处理了像 OAuth 这样的讨厌的事情。我想使用FakeWeb-esque 库进行测试,因为我不想将我的测试耦合到flickr_api。 -
你能把测试和你正在测试的方法显示出来,我可以帮你写一个Mock。
-
嗯,上传就一行。
flickr.upload(photo_file="/path/to/foobar.jpg", title="foobar")但是你为此编写一个模拟非常简单,但正如我所说,我不想将我的测试与python_flickr_api的界面结合起来。
标签: python mocking httplib fakeweb