vic*_*hen 9 python unit-testing werkzeug flask
我正在尝试使用来自http://flask.pocoo.org/docs/testing/的建议测试我的Flask应用程序,但我无法弄清楚如何使用表单数据测试DELETE方法.
我的删除方法看起来像这样:
from flask.ext.restful import Resource, reqparse
...
def delete(self):
self.reqparse.add_argument('arg1', type=str, required=True, location='form')
args = self.reqparse.parse_args()
...
Run Code Online (Sandbox Code Playgroud)
我想测试一下:
def setUp(self):
self.app = myApp.app.test_client()
def test_delete(self):
rv = self.app.delete('MyEndPoint', data={'arg1', 'val'})
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我还在werkzeug.test中查看了EnvironBuilder的源代码,但仍然不知道如何传递数据.
我刚遇到同样的问题,这基本上是因为Werkzeug的测试方法目前不支持设置content_type
DELETE请求.
这里的代码显示了Werkzeug如何获取内容类型:
def _get_content_type(self):
ct = self.headers.get('Content-Type')
if ct is None and not self._input_stream:
if self.method in ('POST', 'PUT', 'PATCH'):
if self._files:
return 'multipart/form-data'
return 'application/x-www-form-urlencoded'
return None
return ct
Run Code Online (Sandbox Code Playgroud)
如果没有content_type
,那么表单数据永远不会出现environ
在请求中,因此Flask服务器实际上并没有发送数据.
最终,这是Werkzeug的一个错误,因为您可以制作一个curl
使用DELETE方法并包含表单数据的请求.我已经向Werkzeug回购提交了拉动请求来解决这个问题.随意在github上加入:https://github.com/mitsuhiko/werkzeug/pull/620
更新:要实际解决您的问题,您可以通过在请求中明确说明内容类型来解决此问题,如下所示:
def test_delete(self):
rv = self.app.delete('MyEndPoint',
data={'arg1', 'val'},
headers={'Content-Type': 'application/x-www-form-urlencoded'})
Run Code Online (Sandbox Code Playgroud)
再次更新:我提交的拉取请求已经过审核,改进和合并,并将包含在Werkzeug的0.10版本中,所以希望这不应该是一个问题:)