Birim testlerinde JSON'larla istek gönderme


101

İstekte JSON kullanan bir Flask uygulamasında kodum var ve JSON nesnesini şu şekilde alabiliyorum:

Request = request.get_json()

Bu iyi çalışıyor, ancak Python'un birim test modülünü kullanarak birim testleri oluşturmaya çalışıyorum ve istekle birlikte bir JSON göndermenin bir yolunu bulmakta güçlük çekiyorum.

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

Bu bana şunu verir:

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

Flask, gönderi isteği içinde json = dict (foo = 'bar') ayarlayabileceğiniz bir JSON argümanına sahip gibi görünüyor, ancak bunu unittest modülüyle nasıl yapacağımı bilmiyorum.


Ne request.dataiçeriyor? Genellikle json ayrıştırma yanlış girdi nedeniyle başarısız olduğunda, sessizce başarısız olur ve geri döner, Nonebu nedenle ham girdi verileri json olmayabilir.
Benoît Latinier

>>> request.get_data () '{"foo": "bar"}' >>> request.get_json () Hiçbiri flask'ın isteğinin nasıl çalıştığından tam olarak emin değilim, ancak verileri ve json'u ayırıyor gibi görünüyor ve ben herhangi bir mantıklıysa, veriden ziyade json'a nasıl bilgi gönderileceğini çözemiyorum.
Sepehr Nazari

9
bence içerik türü başlıkları, bunları uygulama / json olarak ayarlamaya çalışın. ayrıca force parametresi de yararlıdır, ancak muhtemelen sadece
birim testlerinin

Yanıtlar:


201

Gönderiyi olarak değiştirme

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

onu düzeltti.

User3012759'a teşekkürler.


bununla kafamı mahvediyordu. Zaten application/jsoniçerik türünü belirtirken verileri neden dökmeniz gerektiğini anlamayın .
dimmg

Bunun bir gönderide gönderdiğiniz her şeyin bir dizi olması gerektiğine inanıyorum.
Sepehr Nazari

18
Şaşırtıcı, bu belgelerde yok, çünkü flask'ın test_client API belgelerine sahip değil!
rjurney

Yanıttan veri nasıl alınır?
değişken

@variable post gibi bir istekten gelen yanıt ile resp = client.post('/my/endpoint/',json=my_json_data)verilere bayt olarak resp.dataulaşabilirsiniz.
amiabl

44

GÜNCELLEME: Flask 1.0 yayımlanan flask.testing.FlaskClientyöntemler, eklenen jsonbağımsız değişken ve Response.get_jsonyöntemi kabul ettiğinden , örneğe bakın .

Flask 0.x için aşağıdaki fişi kullanabilirsiniz:

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
Ve json bağımsız değişkeninin dictbir JSON dizesi olmaması gerektiğini unutmayın !
LaundroMat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.