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
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()
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.
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")
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']
- 1. Có thể đăng nhập tất cả các tiêu đề yêu cầu HTTP bằng Apache không?
- 2. Yêu cầu kiểm tra: cách thiết lập chung cho tất cả các phòng thử nghiệm
- 3. Sửa đổi tiêu đề HTTP cho một yêu cầu JSONP
- 4. Tiêu đề yêu cầu HTTP: Biến UserAgent
- 5. Đặt tiêu đề yêu cầu trong JavaScript
- 6. NSURLYêu cầu đặt tiêu đề HTTP
- 7. Đặt tiêu đề http cho các yêu cầu được tạo bởi trình duyệt?
- 8. Thực hiện yêu cầu tiêu đề HTTP với netcat
- 9. Nhận tiêu đề phản hồi từ yêu cầu HTTP Ruby
- 10. AngularJS chặn tất cả các yêu cầu $ http
- 11. Đặt tiêu đề HTTP cho tất cả các tập lệnh PHP qua .htaccess tập tin
- 12. URL yêu cầu HTTP có phải là một phần của tiêu đề yêu cầu HTTP không?
- 13. CORS trong grails - Tất cả các yêu cầu thất bại?
- 14. Cách xác định "tiêu đề yêu cầu http" trong OpenURI
- 15. Tiêu đề yêu cầu HTTP tùy chỉnh trong HTML
- 16. Cách đặt chuỗi tiêu đề yêu cầu
- 17. Cách đặt danh mục thử nghiệm cho tất cả các bài kiểm tra trong lớp
- 18. Phương pháp thử yêu cầu http yêu cầu
- 19. Tiêu đề phạm vi Http yêu cầu toàn bộ tệp
- 20. Hết hạn tiêu đề khi thử nghiệm trong Chrome
- 21. Xóa tiêu đề từ Angular.js $ http yêu cầu
- 22. Đọc tiêu đề tùy chỉnh yêu cầu HTTP
- 23. Chuyển tiêu đề HTTP tùy chỉnh cho các yêu cầu RESTful
- 24. Bộ lọc Servlet cho tất cả các yêu cầu
- 25. Làm cách nào để đặt tiêu đề trong http nhận yêu cầu?
- 26. Thiết lập Xác thực cơ bản HTTP cho tất cả các yêu cầu
- 27. đặt tiêu đề yêu cầu thiết lập trong selenium
- 28. Làm cách nào để mô phỏng một yêu cầu AJAX với ứng dụng thử nghiệm Flask?
- 29. NUnit - Tải TẤT CẢ TestCaseSources ngay cả khi chúng không được yêu cầu bởi thử nghiệm hiện tại
- 30. Cách đăng nhập tất cả tiêu đề yêu cầu/phản hồi trong Tomcat 7