web-dev-qa-db-fra.com

Comment envoyer des demandes avec JSON dans des tests unitaires

J'ai du code dans une application Flask qui utilise des JSON dans la demande, et je peux obtenir l'objet JSON de la manière suivante:

Request = request.get_json()

Cela fonctionne bien, mais j'essaie de créer des tests unitaires à l'aide du module unittest de Python et j'ai du mal à trouver le moyen d'envoyer un JSON avec la requête.

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

Cela me donne:

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

Flask semble avoir un argument JSON dans lequel vous pouvez définir json = dict (foo = 'bar') dans la demande de publication, mais je ne sais pas comment faire cela avec le module unittest.

85
Sepehr Nazari

Changer le poste en

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

corrigé.

Merci à user3012759.

172
Sepehr Nazari

UPDATE: Depuis Flask 1.0 publié flask.testing.FlaskClient méthodes accepte json argument et Response.get_json méthode ajoutée, voir exemple .

pour Flask 0.x, vous pouvez utiliser le reçu ci-dessous:

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
35
Victor Gavro