12

私はFlaskアプリケーション(Flask 0.9)をテストしています。特に、文書化された方法で実行したいセッションフィクスチャがあります(私が理解しているように):

from flask import Flask, session
app = Flask(__name__)

@app.route('/', methods=['POST'])
def m():
    logging.error(session) # expect {'x': 1}
    return ""

with app.test_request_context() as trc:
  with app.test_client() as c:
    with c.session_transaction() as sess:
      sess['x'] = 1
    c.post()

これは期待どおりに機能し、出力は次のようになります。

ERROR:root:<SecureCookieSession {'x': 1}>

残念ながら、セッション データがエンドポイント関数に設定されていないという予期しない結果に遭遇しています。つまり、出力は次のようになります。

ERROR:root:<SecureCookieSession {}>

この問題は、単体テスト フレームワークから実行した場合にのみ発生します。現状では、縮退したケースでこの問題を再現することはできませんが、この努力の一部の要点をここに示してかなりの努力をしました. 顕著な点は、おそらくそれらの1つが原因であると予想して、itsdangerousとを含めたことです。Google App Engine testbed

私自身のシステムでは、gistよりもさらに進んで、これを分離しようとして、ユニット テスト フレームワークをほぼ完全に複製しました。同様に、テスト フレームワークから関連コードをますます多く削除しました。要するに、縮退したケースと、結果に影響を与える可能性のある私の簡略化されたフレームワークとの違いを考えることができません。pdbのc.post()呼び出しを調べて、この悪意の原因を突き止めようとしましたが、有用な洞察はまだ得られていません。

つまり、問題がどこにあるのかについて、少しの指示や提案をいただければ幸いです。Werkzeug の文脈に影響を与えている可能性があるものは何session_transactionですか?

4

4 に答える 4

4

私の場合、構成ファイルをロードすることで、Cookie を特定のドメインに自動的に制限していました。その場で構成を更新することで、単体テスト中に Cookie を機能させることができました。SESSION_COOKIE_DOMAINプロパティをに設定するとNone、すべてのドメイン (つまり、localhost) がセッションを設定できました。

app.config.update(                                                     
    SESSION_COOKIE_DOMAIN = None                                                
)

ドキュメントの構成処理で説明されている構成設定をいじることができます。

于 2014-04-05T06:04:44.460 に答える
1

古い質問を復活させるのは嫌いですが、この問題の解決策を見つけたと思います。テストのために、サーバー名を次のように設定してみてくださいlocalhost

app.config['SERVER_NAME'] = 'localhost'

私はもともとブライアンのハックを使用していましたが、これで問題が解決しました。

于 2016-01-13T18:20:24.343 に答える
0

実際に失敗するテストケースがなければ、何も言えません。私が考えることができるのはTestClient、リクエストを作成するために使用しているインスタンスが、セッションのセットアップに使用するものとは異なるということだけです。たとえば、次のようにして、Gist を期待どおりに失敗させることができます。

with self.app.test_client() as c:
    with c.session_transaction() as sess:
        sess['d'] = 1
    self.client.post()

しかし、これはここでも要点でもありませんので、理解してください。

于 2013-05-17T19:35:13.047 に答える