2014-06-06 64 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的,所以希望這不應該是一個問題了:)