Come inviare richieste con JSON negli unit test


96

Ho del codice all'interno di un'applicazione Flask che utilizza JSON nella richiesta e posso ottenere l'oggetto JSON in questo modo:

Request = request.get_json()

Funziona bene, tuttavia sto cercando di creare unit test utilizzando il modulo unittest di Python e ho difficoltà a trovare un modo per inviare un JSON con la richiesta.

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

Questo mi dà:

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

Flask sembra avere un argomento JSON in cui puoi impostare json = dict (foo = 'bar') all'interno della richiesta di post, ma non so come farlo con il modulo unittest.


Cosa request.datacontiene? Spesso quando l'analisi json fallisce a causa di un input errato, fallisce silenziosamente e restituisce Nonequindi i dati di input grezzi potrebbero non essere json.
Benoît Latinier

>>> request.get_data () '{"foo": "bar"}' >>> request.get_json () Nessuno Non sono abbastanza sicuro di come funzioni la richiesta di flask, ma sembra separare data e json, e io non riesco a capire come inviare le informazioni al json piuttosto che i dati, se ha senso.
Sepehr Nazari

9
Penso che siano le intestazioni del tipo di contenuto, prova a impostarle su appliacation / json. anche il parametro force è utile ma probabilmente non vuoi andarci solo per far passare unittests, meglio cambiare mime
user3012759

Risposte:


194

Cambiare il post in

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

aggiustato.

Grazie a user3012759.


mi stava distruggendo la testa con questo. Non capisco perché devi scaricare i dati quando stai già specificando il application/jsontipo di contenuto.
dimmg

Credo che sia perché tutto ciò che invii in un post deve essere una stringa.
Sepehr Nazari

17
Sorprendente, questo non è nei documenti, perché test_client di flask non ha documenti API!
rjurney

Come ottenere i dati dalla risposta?
variabile

@variable, con una risposta da una post richiesta come resp = client.post('/my/endpoint/',json=my_json_data)puoi accedere ai dati come byte con resp.data.
amiabl

44

AGGIORNAMENTO: poiché i flask.testing.FlaskClientmetodi rilasciati da Flask 1.0 accettano jsonargomenti e Response.get_jsonmetodi aggiunti, vedi esempio .

per Flask 0.x puoi usare la ricevuta di seguito:

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

1
E non dimenticare che l'argomento json deve essere una dictstringa non JSON!
LaundroMat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.