2014-06-06 22 views
8

Tôi đang cố gắng thử nghiệm ứng dụng Flask của tôi bằng cách sử dụng đề xuất từ ​​http://flask.pocoo.org/docs/testing/, nhưng tôi không thể tìm ra cách thử phương thức DELETE với dữ liệu biểu mẫu.Flask test_client: Thử nghiệm yêu cầu DELETE với dữ liệu

phương pháp xóa của tôi trông giống như thế này:

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() 
    ... 

Tôi muốn thử nghiệm nó với:

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

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

Nhưng nó không hoạt động. Tôi cũng đã xem xét mã nguồn của EnvironBuilder trong werkzeug.test nhưng vẫn không có ý tưởng làm thế nào để vượt qua trong dữ liệu.

+0

Are bạn sử dụng '.delete ('/ url/where/my/endpoint/is/mount ed ', data = {}) 'hoặc' .delete (' name.of.my.endpoint ', data = {}) '? Bởi vì trước đây là những gì bạn muốn (đối số đầu tiên cho 'EnvironBuilder' là một URL). –

+0

Tôi chỉ sử dụng tên, nhưng tôi không nghĩ nó sai. Xem các ví dụ trong [link] (http://flask.pocoo.org/docs/testing/). Ngoài ra, phản hồi cho thấy tôi đang truy cập đúng địa điểm. Nó chỉ là tôi đã không vượt qua trong các dữ liệu một cách chính xác. – victorchen

Trả lời

5

Tôi chỉ gặp vấn đề tương tự, và điều này về cơ bản là vì phương pháp kiểm tra của Werkzeug hiện không hỗ trợ thiết lập các yêu cầu DELETE content_type.

here cho thấy cách Werkzeug được kiểu nội dung:

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 

Nếu không có content_type, sau đó các dữ liệu mẫu không bao giờ làm cho nó ra khỏi environ và vào yêu cầu, vì vậy máy chủ Flask của bạn không thực sự được gửi dữ liệu.

Cuối cùng, đây là lỗi với Werkzeug, vì bạn có thể tạo yêu cầu curl sử dụng phương thức DELETE và cũng bao gồm dữ liệu biểu mẫu. Tôi đã gửi yêu cầu kéo đến repo Werkzeug để giải quyết vấn đề này. Cứ tự nhiên kêu vang trong ngày github: https://github.com/mitsuhiko/werkzeug/pull/620

Cập nhật: để thực sự giải quyết vấn đề của bạn trong thời gian trung bình, bạn có thể làm được việc này bằng cách nói rõ ràng một loại nội dung trong yêu cầu của bạn, như vậy:

def test_delete(self): 
    rv = self.app.delete('MyEndPoint', 
         data={'arg1', 'val'}, 
         headers={'Content-Type': 'application/x-www-form-urlencoded'}) 

cập nhật lại: yêu cầu kéo tôi đã gửi đã được xem xét, hoàn thiện, và sáp nhập, và sẽ được đưa vào phiên bản 0.10 của Werkzeug, vì vậy hy vọng điều này không nên là một vấn đề nữa :)

Các vấn đề liên quan