1

Flask アプリをテストしています。

要約すると、ここに私の質問があります:

1) 以下のコード ブロックの最終的な URL アサーションが失敗します。Twill によると、実際の URL は「/auth/login」であるため失敗します。つまり、ユーザーは保護された管理ページにリダイレクトされませんでした。なんで?

2) URL アサーションに「/?next='admin'」リクエスト引数を含めるにはどうすればよいですか? 言い換えれば、正しく解決された「次の」引数をテストする方法はありますか?

3) 機能テストにおいて、301 ステータス コードをアサートする以外に、リダイレクトの動作を示す方法はありますか?

これが私のスクリプトのツイル関連の部分です...

   t.browser.go(t.url("/auth/login/?next=%2Fadmin%2F"))
   url("/auth/login/?next=%2Fadmin%2F")

結果のトレースバックは次のとおりです。

   TwillAssertionError: 現在の URL は 'http://127.0.0.1:5000/auth/login/?next=%2Fadmin%2F' です。
「/auth/login/?next=%2Fadmin%2F」と一致しません

注: 奇妙なことに、「go」コマンドの後に 200 ステータス コードをアサートしても、エラーは返されません。上記の URL にログインした後、最終的な URL が実際に管理ページであることを示したいと思います。そのようです...

失敗せずに実行したいテストですが、できません...

def test_redirect_via_url(self):        
        Twill(self.app, port=8080) を t:

            #: ログインする前に管理ページに移動...
            t.browser.go(t.url("/admin"))

            #: ログイン URL にリダイレクトされた管理者 URL をアサートする
            URL('/認証/ログイン')

            #: 上記のアサーションは機能しますが...
            #: なぜこの URL..「次の」引数をアサートできないのですか?
            #: "/auth/login/?next=%2Fadmin%2F"
            #: ブラウザのアドレスバーに実際に表示されるもの

            #: ともあれ、'/auth/login' URL でログインしてみましょう
            fv("1", "ユーザー名", "テスト")
            fv("1", "パスワード", "ようこそ1")
            参加する()

            #: ここで、アプリが実際に保護された管理ページにリダイレクトされることを示したいと思います...
            #: localhost/admin の URL を持つ必要があります
            URL('/管理者')

            #: 上記の URL アサーションは失敗します。送信後の実際の URL は「/auth/login」のままです

4

1 に答える 1

3

その理由は、twill.commands.url渡された URL がブラウザの URLと一致することを正規表現に変換して照合することでアサートするためです。これは、次の/auth/login/?next=%2Fadmin%2Fように変換されます。

/auth/login       # Match this literal string
/?                # followed by zero or one slash
next=%2Fadmin%2F  # followed by this literal string

/auth/login/next=%2Fadmin%2Fつまり、一致するか、一致し/auth/loginnext=%2Fadmin%2Fないことを意味し/auth/login/?next=%2Fadmin%2Fます。回避策は、疑問符をエスケープすることです (url(r"/auth/login/\?next=%2Fadmin%2F")動作するはずです)。

于 2012-11-27T02:47:03.227 に答える