2013-05-07 24 views
5

私はFlaskを使用しており、承認が必要なエンドポイント(および場合によっては他のアプリケーション固有のヘッダー)を持っています。私のテストでは、test_client関数を使用してクライアントを作成し、さまざまなget、put、delete呼び出しを行います。これらのすべての呼び出しには、承認とその他のヘッダーを追加する必要があります。このようなヘッダーをすべての要求に入れるようにテストクライアントをセットアップするにはどうすればよいですか?FlaskテストですべてのリクエストにHTTPヘッダーを設定する

答えて

11

あなたはWSGIアプリをラップし、そこにヘッダを挿入することができます

from flask import Flask, request 
import unittest 

def create_app(): 
    app = Flask(__name__) 

    @app.route('/') 
    def index(): 
     return request.headers.get('Custom', '') 

    return app 

class TestAppWrapper(object): 

    def __init__(self, app): 
     self.app = app 

    def __call__(self, environ, start_response): 
     environ['HTTP_CUSTOM'] = 'Foo' 
     return self.app(environ, start_response) 


class Test(unittest.TestCase): 

    def setUp(self): 
     self.app = create_app() 
     self.app.wsgi_app = TestAppWrapper(self.app.wsgi_app) 
     self.client = self.app.test_client() 

    def test_header(self): 
     resp = self.client.get('/') 
     self.assertEqual('Foo', resp.data) 


if __name__ == '__main__': 
    unittest.main() 
9

Clientクラスはheadersキーワード引数で、その中EnvironBuilderクラス、同じ引数を取ります。

あなたは単にclient.get('/', headers={ ... })を使用して認証を送信できます。

今、あなたは、クライアントからのヘッダーのデフォルトセットを提供したい場合、あなたは(make_test_environ_builderと同類)修正環境ビルダーを提供openの独自の実装を提供する必要があるだろうし、あなたを指すようにapp.test_client_classを設定新しいクラス。

2

@DazWorrall答えの構築、およびWERKZEUGのソースコードに見て、私は認証のために必要なデフォルトのヘッダーを渡すために、次のラッパーになってしまった:

class TestAppWrapper: 
    """ This lets the user define custom defaults for the test client. 
    """ 

    def build_header_dict(self): 
     """ Inspired from : https://github.com/pallets/werkzeug/blob/master/werkzeug/test.py#L591 """ 
     header_dict = {} 
     for key, value in self._default_headers.items(): 
      new_key = 'HTTP_%s' % key.upper().replace('-', '_') 
      header_dict[new_key] = value 
     return header_dict 

    def __init__(self, app, default_headers={}): 
     self.app = app 
     self._default_headers = default_headers 

    def __call__(self, environ, start_response): 
     new_environ = self.build_header_dict() 
     new_environ.update(environ) 
     return self.app(new_environ, start_response) 

あなたはそれが好きで使用することができます。

class BaseControllerTest(unittest.TestCase): 

    def setUp(self): 
     _, headers = self.get_user_and_auth_headers() # Something like: {'Authorization': 'Bearer eyJhbGciOiJ...'} 
     app.wsgi_app = TestAppWrapper(app.wsgi_app, headers) 
     self.app = app.test_client() 

    def test_some_request(self): 
     response = self.app.get("/some_endpoint_that_needs_authentication_header") 
0

テストクライアントの内部にヘッダーを設定できます。

client = app.test_client() 
client.environ_base['HTTP_AUTHORIZATION'] = 'Bearer your_token' 

次に、あなたがリクエストからヘッダーを使用することができます。

request.headers['Authorization'] 
関連する問題