Cách gửi yêu cầu với JSON trong các bài kiểm tra đơn vị


96

Tôi có mã trong ứng dụng Flask sử dụng JSON trong yêu cầu và tôi có thể lấy đối tượng JSON như sau:

Request = request.get_json()

Điều này đã hoạt động tốt, tuy nhiên tôi đang cố gắng tạo các bài kiểm tra đơn vị bằng cách sử dụng mô-đun mới nhất của Python và tôi đang gặp khó khăn khi tìm cách gửi JSON cùng với yêu cầu.

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo = 'bar')))

Điều này cho tôi:

>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None

Flask dường như có đối số JSON nơi bạn có thể đặt json = dict (foo = 'bar') trong yêu cầu bài đăng, nhưng tôi không biết cách thực hiện điều đó với mô-đun đơn nhất.


Cái gì request.datachứa? Thường thì khi phân tích cú pháp json không thành công do nhập sai, nó sẽ không hoạt động âm thầm và trả về Nonedo đó dữ liệu đầu vào thô có thể không phải là json.
Benoît Latinier

>>> request.get_data () '{"foo": "bar"}' >>> request.get_json () Không. Tôi không chắc về cách thức hoạt động của yêu cầu flask, nhưng nó có vẻ tách biệt dữ liệu và json, và tôi không thể tìm ra cách gửi thông tin đến json thay vì dữ liệu, nếu điều đó có ý nghĩa.
Sepehr Nazari

9
tôi nghĩ đó là tiêu đề loại nội dung, hãy thử đặt chúng thành appacation / json. cũng tham số lực là hữu ích nhưng có thể bạn không muốn đến đó chỉ để chắc unittests vượt qua, tốt hơn để thay đổi kịch câm
user3012759

Câu trả lời:


193

Thay đổi bài đăng thành

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo='bar')),
                       content_type='application/json')

đã sửa nó.

Cảm ơn người dùng3012759.


đã làm tôi đau đầu với điều này. Không hiểu tại sao bạn phải kết xuất dữ liệu khi bạn đã chỉ định application/jsonloại nội dung.
dimmg

Tôi tin rằng đó là bởi vì mọi thứ bạn gửi trong một bài đăng phải là một chuỗi.
Sepehr Nazari,

17
Thật ngạc nhiên, điều này không có trong tài liệu, vì test_client của flask không có tài liệu API!
rjurney

Làm thế nào để lấy dữ liệu từ phản hồi?
biến

@variable, với phản hồi từ một post yêu cầu giống như resp = client.post('/my/endpoint/',json=my_json_data)bạn có thể truy cập dữ liệu dưới dạng byte với resp.data.
amiabl

44

CẬP NHẬT:flask.testing.FlaskClientcác phương thức được phát hành trong Flask 1.0 chấp nhận jsonđối số và Response.get_jsonphương thức được thêm vào, hãy xem ví dụ .

đối với Bình 0.x, bạn có thể sử dụng biên lai dưới đây:

from flask import Flask, Response as BaseResponse, json
from flask.testing import FlaskClient
from werkzeug.utils import cached_property


class Response(BaseResponse):
    @cached_property
    def json(self):
        return json.loads(self.data)


class TestClient(FlaskClient):
    def open(self, *args, **kwargs):
        if 'json' in kwargs:
            kwargs['data'] = json.dumps(kwargs.pop('json'))
            kwargs['content_type'] = 'application/json'
        return super(TestClient, self).open(*args, **kwargs)


app = Flask(__name__)
app.response_class = Response
app.test_client_class = TestClient
app.testing = True

1
Và đừng quên rằng đối số json phải là một dictchuỗi JSON!
LaundroMat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.