如何在单元测试中使用 JSON 发送请求
How to send requests with JSON in unit tests
我在请求中使用 JSONs 的 Flask 应用程序中有代码,我可以像这样获取 JSON 对象:
Request = request.get_json()
这一直工作正常,但是我正在尝试使用 Python 的单元测试模块创建单元测试,但我很难找到一种方法来发送带有请求的 JSON。
response=self.app.post('/test_function',
data=json.dumps(dict(foo = 'bar')))
这给了我:
>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None
Flask 似乎有一个 JSON 参数,您可以在其中设置 json=dict(foo='bar') 在 post 请求中,但我没有知道如何使用 unittest 模块做到这一点。
将 post 更改为
response=self.app.post('/test_function',
data=json.dumps(dict(foo='bar')),
content_type='application/json')
已修复。
感谢用户3012759。
自从 Flask 1.0 版本 flask.testing.FlaskClient
方法接受 json
参数并添加了 Response.get_json
方法,参见 pull request
with app.test_client() as c:
rv = c.post('/api/auth', json={
'username': 'flask', 'password': 'secret'
})
json_data = rv.get_json()
对于 Flask 0.x 兼容性,您可以使用下面的收据:
from flask import Flask, Response as BaseResponse, json
from flask.testing import FlaskClient
class Response(BaseResponse):
def get_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
我在请求中使用 JSONs 的 Flask 应用程序中有代码,我可以像这样获取 JSON 对象:
Request = request.get_json()
这一直工作正常,但是我正在尝试使用 Python 的单元测试模块创建单元测试,但我很难找到一种方法来发送带有请求的 JSON。
response=self.app.post('/test_function',
data=json.dumps(dict(foo = 'bar')))
这给了我:
>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None
Flask 似乎有一个 JSON 参数,您可以在其中设置 json=dict(foo='bar') 在 post 请求中,但我没有知道如何使用 unittest 模块做到这一点。
将 post 更改为
response=self.app.post('/test_function',
data=json.dumps(dict(foo='bar')),
content_type='application/json')
已修复。
感谢用户3012759。
自从 Flask 1.0 版本 flask.testing.FlaskClient
方法接受 json
参数并添加了 Response.get_json
方法,参见 pull request
with app.test_client() as c:
rv = c.post('/api/auth', json={
'username': 'flask', 'password': 'secret'
})
json_data = rv.get_json()
对于 Flask 0.x 兼容性,您可以使用下面的收据:
from flask import Flask, Response as BaseResponse, json
from flask.testing import FlaskClient
class Response(BaseResponse):
def get_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