0

だから私は webtest ライブラリでいくつかのテストケースを実行しようとしています.問題は、私のサイトにユーザーがログインする必要があるアクセス制御があることです. フォームの投稿は成功したようですが、結果にはCookieがなく(少なくとも見つけることができました)、ログイン後にcookiejarは空です。

テスト設定:

class TestMyViewSuccessCondition(unittest.TestCase):

    def setUp(self):
        self.config = testing.setUp()

        from myapp import main

        settings = {'sqlalchemy.url': postgresqlURL}
        app = main({}, **settings)
        from webtest import TestApp

        self.testapp = TestApp(app, cookiejar=CookieJar())

テスト:

    page = self.testapp.get('/login', status=200)

    self.assertIn('Please login', page)

    form = page.forms['loginForm']
    form['username'] = 'user'
    form['password'] = 'userpw'

    result = form.submit(status=200)

    # self.testapp.cookies is empty dictionary at this point
    # it fails here, login page is shown again
    page = self.testapp.get('/home', status=200)

結果は 200 OK を返し、ログイン ページの HTML コンテンツは、フォームの送信後にリダイレクトされませんが、問題はありますか? それとも意図したとおりに機能していますか?アクセス制御の前は、他のフォームの送信は問題なく機能していました。Cookie は、ユーザーがリンクをクリックするか、ページをリロードするたびに変更されます。セッションクッキーを使用しています。Cookie に安全でないフラグを設定しようとしました。

そして私のログインビューの最後のリターン:

if 'form.submitted' in request.POST:
# do stuff
    return HTTPFound(location=request.route_url('home'))

私は通常の単体テストを使用しますが、ビューがリダイレクトしようとすると単体テストモジュールがナットを失うため、誰かが webtest ライブラリを提案しました。

4

1 に答える 1

0

問題はform.submit()、ユーザーが送信ボタンをクリックする私の基本的なユースケースを実際に模倣していなかったことです。通常、ブラウザはユーザー名、パスワード、および の('form.submitted', '')内側を追加しますrequest.POST。ただし、form.submit()ユーザー名とパスワードのみが追加され、フォームで定義されているもののみが追加されるため、要求に合わせて独自の値を定義できませんでした。(少なくとも私は方法を知りませんでした)

ログインビュー内で問題が解決されました。if 'form.submitted' in request.POST:->を変更することによりif 'username' in request.POST and 'password' in request.POST:

上記のように、Cookie は正常に機能しています。ログインでテストをサポートできませんでした。

于 2016-06-17T13:29:14.893 に答える