2013-05-07 37 views
5

Tôi đang sử dụng Flask và có các điểm cuối yêu cầu ủy quyền (và đôi khi các tiêu đề ứng dụng cụ thể khác). Trong các thử nghiệm của tôi, hãy sử dụng hàm test_client để tạo một ứng dụng khách và sau đó thực hiện các cuộc gọi, đặt, xóa khác nhau. Tất cả các cuộc gọi này sẽ yêu cầu ủy quyền và các tiêu đề khác sẽ được thêm vào. Làm thế nào tôi có thể thiết lập các khách hàng thử nghiệm để đặt tiêu đề như vậy trên tất cả các yêu cầu?Đặt tiêu đề HTTP cho tất cả các yêu cầu trong thử nghiệm Flask

Trả lời

11

Bạn có thể quấn ứng dụng WSGI và bơm tiêu đề đó:

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

Lớp Client mất những lập luận tương tự như lớp EnvironBuilder, trong đó là lập luận headers từ khóa.

Vì vậy, bạn chỉ cần sử dụng client.get('/', headers={ ... }) để gửi xác thực của mình.

Bây giờ nếu bạn muốn cung cấp một bộ mặc định của tiêu đề từ khách hàng, bạn cần phải cung cấp thực hiện của riêng bạn open mà cung cấp một môi trường xây dựng sửa đổi (giống như make_test_environ_builder) và thiết lập app.test_client_class để trỏ đến của bạn lớp mới.

2

xây dựng trên @DazWorrall câu trả lời, và nhìn vào mã nguồn Werkzeug, tôi đã kết thúc với wrapper sau cho đi Headers mặc định rằng tôi cần để xác thực:

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) 

Sau đó bạn có thể sử dụng nó như:

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

Bạn có thể đặt tiêu đề bên trong ứng dụng khách thử nghiệm.

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

Sau đó, bạn có thể sử dụng tiêu đề từ yêu cầu:

request.headers['Authorization'] 
Các vấn đề liên quan