2013-05-07 16 views
5

Flask kullanıyorum ve yetkilendirme gerektiren uç noktalara (ve bazen de uygulamaya özel başka başlıklar) sahibim. Testlerimde bir istemci oluşturmak için test_client işlevini kullanın ve ardından çeşitli arama, alma, çağrıları silme işlemini yapın. Bu çağrıların tümü yetkilendirmeyi ve eklenecek diğer başlıkların kullanılmasını gerektirecektir. Test istemcisini, bu istekleri tüm isteklere eklemek için nasıl kurabilirim?Bir Flask testindeki tüm istekler için HTTP üstbilgileri ayarlayın

cevap

11

Sen WSGI uygulamasını sarın ve orada başlıkları enjekte edebilir

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 sınıf headers kelime argümanı aralarında EnvironBuilder sınıfında, aynı argüman alır.

Kimlik doğrulamanızı göndermek için client.get('/', headers={ ... })'u kullanabilirsiniz.

Şimdi

Eğer istemciden başlıklarını varsayılan olarak bir dizi sağlamak istiyorsanız, siz (make_test_environ_builder benzeyen) modifiye ortam oluşturucu sağlayan open kendi uygulama sağlamak gerekiyordu ve işaret edecek app.test_client_class set senin yeni sınıf.

2

@DazWorrall cevap üzerine inşa edilen ve Werkzeug kaynak koduna bakarak, ben kimlik doğrulaması için gerekli varsayılan Başlıkları geçmek için aşağıdaki sarmalayıcı ile sona erdi:

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) 

Daha sonra bu gibi kullanabilirsiniz:

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

Başlığı test istemcisinin içine ayarlayabilirsiniz.

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

Sonra isteğinden başlığını kullanabilirsiniz:

request.headers['Authorization'] 
İlgili konular