単体テスト中に FLask (Werkzeug) によって提供されるリクエスト オブジェクトの User-Agent を設定 (モック) する方法を知っている人はいますか?
現在のところ、 request.headers['User-Agent'] などの詳細を取得しようとすると、Flask test_client() がこれらを設定していないため、KeyError が発生します。(以下の部分的なスタック トレースを参照)
単体テスト中に Flask プロジェクトのリクエスト オブジェクトからユーザー エージェントを取得しようとすると、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'
- アップデート -
以下の (受け入れられた) ソリューションと共に、environ_base ヒントは、この他のSO ソリューションに私を導きます。このソリューションの前提は、Flask アプリのラッパー クラスを作成し、callメソッドをオーバーライドして環境変数を自動的に設定することです。このようにして、すべての呼び出しに対して変数が設定されます。したがって、私が最終的に実装したソリューションは、このプロキシ クラスを作成することです。
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()