Flask test_client:使用数据测试DELETE请求

时间:2014-06-06 02:58:36

标签: python unit-testing flask werkzeug

我尝试使用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()
    ...

我想用以下方法测试:

def setUp(self):
    self.app = myApp.app.test_client()

def test_delete(self):
    rv = self.app.delete('MyEndPoint', data={'arg1', 'val'})

但它不起作用。我还在werkzeug.test中查看了EnvironBuilder的源代码,但仍然不知道如何传递数据。

1 个答案:

答案 0 :(得分:7)

我刚遇到同样的问题,这基本上是因为Werkzeug的测试方法目前不支持设置DELETE请求的content_type

代码here显示了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

如果没有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'})

再次更新:我提交的拉取请求已经过审核,改进和合并,并将包含在Werkzeug的0.10版本中,所以希望这不再是一个问题了:)