Как отправлять запросы с JSON в модульных тестах

У меня есть код в приложении Flask, которое использует JSON в запросе, и я могу получить объект 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.

2 ответа

Решение

Изменение сообщения на

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 добавлен метод, см. пример.

для колбы 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
Другие вопросы по тегам