如何在单元测试中使用JSON发送请求

Sep*_*ari 88 python json flask python-unittest

我在Flask应用程序中有代码,在请求中使用JSON,我可以像这样得到JSON对象:

Request = request.get_json()
Run Code Online (Sandbox Code Playgroud)

这一直很好,但我正在尝试使用Python的unittest模块创建单元测试,而我很难找到一种方法来发送带有请求的JSON.

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo = 'bar')))
Run Code Online (Sandbox Code Playgroud)

这给了我:

>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None
Run Code Online (Sandbox Code Playgroud)

Flask似乎有一个JSON参数,您可以在post请求中设置json = dict(foo ='bar'),但我不知道如何使用unittest模块.

Sep*_*ari 180

将帖子更改为

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

固定它.

感谢user3012759.

  • 令人惊讶的是,这不在文档中,因为flask的test_client没有API文档! (12认同)
  • @variable,通过像“resp = client.post('/my/endpoint/',json=my_json_data)”这样的“post”请求的响应,您可以使用“resp.data”以字节形式访问数据。 (2认同)

Vic*_*vro 37

更新:由于Flask 1.0发布的flask.testing.FlaskClient方法接受了添加的json参数和Response.get_json方法,请参阅示例.

对于Flask 0.x,您可以使用下面的收据:

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
Run Code Online (Sandbox Code Playgroud)

  • 并且不要忘记 json 参数必须是 `dict` 而不是 JSON 字符串! (2认同)