現在、Flaskアプリケーションの単体テストを作成しようとしています。多くのビュー関数(ログインなど)で、新しいページにリダイレクトします。たとえば、次のようにします。
@user.route('/login', methods=['GET', 'POST'])
def login():
....
return redirect(url_for('splash.dashboard'))
このリダイレクトが単体テストで発生することを確認しようとしています。今、私は持っています:
def test_register(self):
rv = self.create_user('John','Smith','[email protected]', 'helloworld')
self.assertEquals(rv.status, "200 OK")
# self.assert_redirects(rv, url_for('splash.dashboard'))
この関数は、返される応答が200であることを確認しますが、最後の行は明らかに有効な構文ではありません。どうすればこれを主張できますか?ぼくの create_user
関数は単純です:
def create_user(self, firstname, lastname, email, password):
return self.app.post('/user/register', data=dict(
firstname=firstname,
lastname=lastname,
email=email,
password=password
), follow_redirects=True)
ありがとう!
試してください Flask-Testing
assertRedirects のAPIがありますこれを使用できます
assertRedirects(response, location)
Checks if response is an HTTP redirect to the given location.
Parameters:
response – Flask response
location – relative URL (i.e. without http://localhost)
TESTスクリプト:
def test_register(self):
rv = self.create_user('John','Smith','[email protected]', 'helloworld')
assertRedirects(rv, url of splash.dashboard)
Flaskには 組み込みのテストフック とテストクライアントがあり、このような機能的なものに最適です。
from flask import url_for
import yourapp
test_client = yourapp.app.test_client()
response = test_client.get(url_for('whatever.url'), follow_redirects=True)
# check that the path changed
assert response.request.path == url_for('redirected.url')
ドキュメントにはこれを行う方法の詳細が記載されていますが、参考までに「flaskr」が表示された場合、それはテストクラスの名前であり、Flaskには何もありません。
1つの方法は、リダイレクトに従わないことです(リクエストから_follow_redirects
_を削除するか、明示的にFalse
に設定します)。
次に、self.assertEquals(rv.status, "200 OK")
を次のように置き換えるだけです。
_self.assertEqual(rv.status_code, 302)
self.assertEqual(rv.location, url_for('splash.dashboard', _external=True))
_
何らかの理由で_follow_redirects
_を引き続き使用する場合、別の(やや脆弱な)方法は、_rv.data
_の応答のHTML要素IDなど、予想されるダッシュボード文字列を確認することです。例えばself.assertIn('dashboard-id', rv.data)