2014-06-06 22 views
8

我想用http://flask.pocoo.org/docs/testing/的建议来测试我的Flask应用程序,但我无法弄清楚如何用表单数据测试DELETE方法。烧瓶test_client:用数据测试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的源代码,但仍然不知道如何传递数据。

+0

是你使用'.delete('/ url/where/my/endpoint/is/mount ed',data = {})'或'.delete('name.of.my.endpoint',data = {})'?因为前者是你想要的(EnvironBuilder的第一个参数是一个URL)。 –

+0

我只使用名称,但我不认为这是错误的。见[link](http://flask.pocoo.org/docs/testing/)中的例子。此外,响应显示我正在访问正确的地方。这只是我没有正确传递数据。 – victorchen

回答

5

我刚刚遇到同样的问题,这基本上是因为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,进入的要求,所以你的瓶服务器不实际上发送了数据。

最终,这是一个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'}) 

再次更新:我提交的拉动请求进行了审查,提炼和融合,并将包含在0.10版本WERKZEUG的,所以希望这不应该是一个问题了:)