2015-03-03 10 views
62

Mam kodu w aplikacji Kolby który używa JSONs we wniosku, i mogę uzyskać obiektu JSON tak:Jak wysyłać żądania z JSONs w jednostce testuje

Request = request.get_json() 

Zostało to działa dobrze, jednak Próbuję utworzyć testy jednostkowe przy użyciu modułu Unittest Pythona i mam trudności ze znalezieniem sposobu wysłania JSON z żądaniem.

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

To daje mi:

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

Kolba wydaje się mieć argument, JSON, w którym można ustawić json = dict (foo = 'bar') w żądaniu post, ale nie wiem jak to zrobić z modułem unittest.

+0

Co oznacza 'request.data' zawiera? Często, gdy analizowanie json nie powiedzie się z powodu błędnych danych wejściowych, nie działa w trybie cichym i zwraca 'Brak', więc surowe dane wejściowe mogą nie być json. –

+0

>>> request.get_data() '{ "foo": "bar"}' >>> request.get_json() Żaden Nie jestem pewien, jak prośba kolby za działa, ale wydaje się, aby oddzielić dane i json, i nie mogę wymyślić, jak przesłać informacje do json, a nie dane, jeśli to ma jakiś sens. –

+9

Myślę, że to nagłówki typu zawartości, spróbuj ustawić je na appliacation/json. również parametr siły jest pomocny, ale prawdopodobnie nie chcesz tam iść tylko po to, aby unittests przeminął, lepiej zmienić mime – user3012759

Odpowiedz

116

Zmiana post do

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

naprawił.

Dzięki dla użytkownika3012759.

+0

, który zniszczył mi głowę. Nie rozumiem, dlaczego musisz zrzucić dane, gdy już określasz typ zawartości 'application/json'. – dimmg

+0

Uważam, że dzieje się tak, ponieważ wszystko, co wyślesz w poście, musi być ciągiem. –

+0

Niesamowite, czego nie ma w dokumentach, ponieważ test_clask w kolbie nie ma dokumentów API! – rjurney

8

Prosty przepis na testowanie aplikacji json kolby

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 
Powiązane problemy