26

単体テスト中に 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()
4

2 に答える 2

28

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

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

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

詳細については、 http://werkzeug.pocoo.org/docs/test/#testing-apiを参照してください。

于 2013-03-07T20:33:22.430 に答える
6

@chris-mckinnel が書いたものは機能しますenviron_baseが、この場合は使用しません。

以下に示すように、簡単に何かを行うことができます。

with app.test_request_context('url', headers={'User-Agent': 'Your value'}):
    pass

これは仕事をすると同時に、コードを明示的に保ちます-明示的は暗黙的よりも優れています。

test_request_context参照に何を渡すことができるか知りたい場合は、EnvironBuilder定義; ここで見つけることができます。

于 2018-08-08T09:05:18.613 に答える