Hoe verzoeken te verzenden met JSON in unit tests

Ik heb code in een Flask-toepassing die JSON’s gebruikt in het verzoek, en ik kan het JSON-object als volgt verkrijgen:

Request = request.get_json()

Dit werkt prima, maar ik probeer unit-tests te maken met behulp van de unittest-module van Python en ik heb problemen met het vinden van een manier om een ​​JSON met het verzoek te verzenden.

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

Dit geeft me:

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

Flask lijkt een JSON-argument te hebben waarbij je json=dict(foo=’bar’) in het postverzoek kunt instellen, maar ik weet niet hoe ik dat moet doen met de unittest-module.


Antwoord 1, autoriteit 100%

Het bericht wijzigen in

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

het gerepareerd.

Met dank aan gebruiker3012759.


Antwoord 2, autoriteit 26%

Sinds de release van Flask 1.0 flask.testing.FlaskClientmethoden accepteren jsonargument en Response.get_jsonmethode toegevoegd, zie trekverzoek

   with app.test_client() as c:
        rv = c.post('/api/auth', json={
            'username': 'flask', 'password': 'secret'
        })
        json_data = rv.get_json()

Voor compatibiliteit met Flask 0.x kunt u de onderstaande bon gebruiken:

   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

Other episodes