web-dev-qa-db-ja.com

テストリダイレクトIn Flask with Python Unittest

現在、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)

ありがとう!

14
Jason Brooks

試してください 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)
10
kartheek

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には何もありません。

15
Rachel Sanders

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)

5
broox