2013-03-07 13 views
14

ユニットテスト中にFLask(Werkzeug)が提供するリクエストオブジェクトのUser-Agentを設定(模擬)する方法を知っている人はいますか?Flaskアプリユニットテスト用のリクエストヘッダを設定する

現在のところ、request.headers ['User-Agent']などの詳細を取得しようとすると、Flaskのtest_client()がこれらを設定しないため、KeyErrorが発生します。

ユニットテスト中にFlaskプロジェクトのリクエストオブジェクトからUser-Agentを取得しようとすると、KeyErrorが発生します。

File "/Users/me/app/rest/app.py", line 515, in login 
    if request.headers['User-Agent']: 
File "/Users/me/.virtualenvs/app/lib/python2.7/site-packages/werkzeug/datastructures.py", line 1229, in __getitem__ 
    return self.environ['HTTP_' + key] 
    KeyError: 'HTTP_USER_AGENT' 

- UPDATE -

以下(受け入れ)ソリューションとともに、environ_baseヒントは、この他SO solutionに私をリードしています。このソリューションの前提は、Flaskアプリケーション用のラッパークラスを作成し、コールメソッドをオーバーライドして環境変数を自動的に設定することです。このようにして、変数はすべての呼び出しに対して設定されます。だから、私は実装終わったソリューションは、このプロキシクラスを作成している。その後、

class FlaskTestClientProxy(object): 
    def __init__(self, app): 
     self.app = app 

    def __call__(self, environ, start_response): 
     environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1') 
     environ['HTTP_USER_AGENT'] = environ.get('HTTP_USER_AGENT', 'Chrome') 
     return self.app(environ, start_response) 

そして、そのプロキシとWSGIコンテナをラップ:

app.wsgi_app = FlaskTestClientProxy(app.wsgi_app) 
test_client = app.test_client() 

答えて

21

あなたはget()post()を呼び出すときenviron_baseに渡す必要があります。例えば、

client = app.test_client() 
response = client.get('/your/url/', 
         environ_base={'HTTP_USER_AGENT': 'Chrome, etc'}) 

次に、あなたのrequest.user_agentあなたに渡し、あなたがrequest.headers['User-Agent']経由でアクセスできるものは何でもする必要があります。

詳細はを参照してください。

+0

ありがとうございます!私は上記の私の最初の質問に含まれているソリューションを使用して終了しましたが、これは完璧にうまくいったでしょう。 – prschmid

+0

あなたがすべてのテストでそれらの環境変数を設定する必要がある場合、素晴らしい解決策であると私は思っています...実際には、同じことをするために私のFlaskアプリケーションを変更すると確信しています! –

+0

素晴らしいです。お役に立てて嬉しいです! – prschmid

関連する問題