2015-03-03 18 views
62

Ho codice all'interno di un'applicazione Flask che utilizza JSONs nella richiesta, e posso ottenere l'oggetto JSON in questo modo:Come inviare le richieste con JSONs in unità di test

Request = request.get_json() 

Ciò sta funzionando bene, tuttavia Sto provando a creare test unitari usando 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 cui è possibile impostare JSON = dict (foo = 'bar') all'interno della richiesta post, ma non so come farlo con il modulo unittest.

+0

Che cosa significa il 'request.data' contiene? Spesso quando l'analisi di json fallisce a causa di un input sbagliato, fallisce silenziosamente e restituisce "None", quindi i dati di input non elaborati potrebbero non essere json. –

+0

>>> request.get_data() '{ "pippo": "bar"}' >>> request.get_json() Nessuno Io non sono molto sicuro di come funziona la richiesta di pallone, ma sembra separare dati e JSON, e non riesco a capire come inviare informazioni a JSON piuttosto che ai dati, se questo ha senso. –

+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 andare lì solo per far passare le unittests, meglio cambiare il mime – user3012759

risposta

116

Cambiare l'intervento ad

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

riparato.

Grazie all'utente3012759.

+0

mi stava rovinando la testa. Non capisco perché devi scaricare i dati quando stai già specificando il tipo di contenuto 'application/json'. – dimmg

+0

Credo che sia perché tutto ciò che si invia in un post deve essere una stringa. –

+0

Incredibile questo non è nei documenti, perché test_client di flask non ha documenti API! – rjurney

8

ricetta semplice per le applicazioni JSON pallone test

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 
Problemi correlati