前回、View
やMethodView
クラスを使って実装を始めたアプリのUIをテストしたい。
と思って、FlaskのTesting Flask Applicationsを見ながら実装するも、ハマるハマる。
sessionに格納した情報を元に動作する関数のテストってどうやるの?
こうやるんだそうです。
from flask import Flask, session
app = Flask("hoge")
with app.test_client() as c:
c.get('/login')
assert session['foo'] == 42
でも実行してみるとこんなエラーをraiseしてくれちゃいます。なんやこれ。
bash-3.2$ nosetests
E..
======================================================================
ERROR: test_get (test_api_account.TestAccountApi)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/takashi/Development/necco/test/test_api_account.py", line 59, in test_get
with c.session_transaction() as ses:
File "/Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/Python.framework/Versions/3.5/lib/python3.5/contextlib.py", line 59, in __enter__
return next(self.gen)
File "/Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/envs/necco/lib/python3.5/site-packages/flask/testing.py", line 92, in session_transaction
raise RuntimeError('Session backend did not open a session. '
RuntimeError: Session backend did not open a session. Check the configuration
----------------------------------------------------------------------
Ran 3 tests in 1.200s
FAILED (errors=1)
bash-3.2$ exit
exit
shell returned 1
ググってみると、Stackoverflowにありがたい記事発見。
If you did not set a custom app.session_interface, then you forgot to set a secret key
「SECRET_KEYの設定してないんじゃないの?」というご指摘。あ、確かに。
設定してみると、しっかり動きました。
session
を予めログイン済み状態にしてテストしたい
from flask import Flask
app = Flask("hoge")
with app.test_client() as c:
with c.session_transaction() as sess:
sess['username'] = 'hoge_user'
c.get()