<Python, flask> test_client()

Flaskさんをやっていて、app.app_context()をやるがいいが、
実際の動作requestに対する応答を確認するいい方法がないかと思っていたら、ありました。
さすがっす。

app.test_client()らしいっす。

このまえ、かりかり作ったスクリプト(下)でちと実験。

github.com

In [1]: import restapi

In [3]: restapi.db.create_all()

In [5]: app = restapi.app.test_client()

In [6]: type(app)
Out[6]: flask.testing.FlaskClient

In [7]: dir(app)
Out[7]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__enter__',
 '__eq__',
 '__exit__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'allow_subdomain_redirects',
 'application',
 'cookie_jar',
 'delete',
 'delete_cookie',
 'environ_base',
 'get',
 'head',
 'open',
 'options',
 'patch',
 'post',
 'preserve_context',
 'put',
 'resolve_redirect',
 'response_wrapper',
 'run_wsgi_app',
 'session_transaction',
 'set_cookie',
 'trace']

In [8]: app.get('/')
Out[8]: <Response streamed [404 NOT FOUND]>

In [11]: app.get('/sqlalc/1/Taro/Hage')
Out[11]: <Response streamed [403 FORBIDDEN]>

In [12]: app.put('/sqlalc/-/Taro/Hage')
Out[12]: <Response streamed [200 OK]>

In [13]: app.get('/sqlalc/1/Taro/Hage')
Out[13]: <Response streamed [200 OK]>

In [15]: r = app.get('/sqlalc/1/Taro/Hage')

In [17]: r.get_data()
Out[17]: b'{\n  "id": 1, \n  "looks": "Hage", \n  "name": "Taro", \n  "r": "GET success"\n}\n'

In [18]: r.get_data().decode('UTF-8')
Out[18]: '{\n  "id": 1, \n  "looks": "Hage", \n  "name": "Taro", \n  "r": "GET success"\n}\n'

In [19]: import json

In [20]: json.loads(r.get_data().decode('UTF-8'))
Out[20]: {'id': 1, 'looks': 'Hage', 'name': 'Taro', 'r': 'GET success'}

In [21]: r.status
Out[21]: '200 OK'

In [22]: r.status_code
Out[22]: 200

にゃるほど!

マニュアル。
API — Flask Documentation (0.12)

Testing Flask Applications — Flask Documentation (0.12)

お世話になったところ。

http://momijiame.tumblr.com/post/39324429279/python-の-flask-で作ったアプリケーションをテストする
momijiame.tumblr.com

追記。
app.app_context()からも順に呼べば、app.test_client()が呼べる。

In [23]: ctx = restapi.app.app_context()

In [25]: type(ctx)
Out[25]: flask.ctx.AppContext

In [26]: ctx.app.test_client()
Out[26]: <FlaskClient <Flask 'restapi'>>

In [27]: type(ctx.app.test_client())
Out[27]: flask.testing.FlaskClient

In [28]: type(app)
Out[28]: flask.testing.FlaskClient