web-dev-qa-db-ja.com

ユニットテストでJSONを使用してリクエストを送信する方法

リクエストでJSONを使用するFlaskアプリケーション内にコードがあり、次のようにJSONオブジェクトを取得できます。

Request = request.get_json()

これは正常に機能していますが、Pythonのunittestモジュールを使用して単体テストを作成しようとしており、リクエストでJSONを送信する方法を見つけることが困難です。

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

これは私に与えます:

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

Flaskには、postリクエスト内でjson = dict(foo = 'bar')を設定できるJSON引数があるようですが、unittestモジュールでそれを行う方法がわかりません。

85
Sepehr Nazari

投稿を変更する

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

それを修正しました。

User3012759に感謝します。

172
Sepehr Nazari

UPDATE:Flask 1.0がリリースされたflask.testing.FlaskClientメソッドはjson引数とResponse.get_jsonメソッドを受け入れる追加、 を参照してください。

Flask 0.xの場合、以下の領収書を使用できます。

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
35
Victor Gavro