Han*_*xue 6 python pytest flask flask-jwt flask-jwt-extended
这是我要测试的功能
@jwt_required
def get_all_projects(self):
# implementation not included here
Run Code Online (Sandbox Code Playgroud)
我从pytest类调用函数
def test_get_all_projects(db_session):
all_projects = ProjectController.get_all_projects()
Run Code Online (Sandbox Code Playgroud)
用db_session夹具
@pytest.fixture(scope='function')
def db_session(db, request):
"""Creates a new database session for a test."""
engine = create_engine(
DefaultConfig.SQLALCHEMY_DATABASE_URI,
connect_args={"options": "-c timezone=utc"})
DbSession = sessionmaker(bind=engine)
session = DbSession()
connection = engine.connect()
transaction = connection.begin()
options = dict(bind=connection, binds={})
session = db.create_scoped_session(options=options)
db.session = session
yield session
transaction.rollback()
connection.close()
session.remove()
Run Code Online (Sandbox Code Playgroud)
这导致错误
> raise NoAuthorizationError("Missing {} Header".format(header_name))
E flask_jwt_extended.exceptions.NoAuthorizationError: Missing Authorization Header
../../.virtualenvs/my-app/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py:132: NoAuthorizationError
Run Code Online (Sandbox Code Playgroud)
create_access_token当我调用create_access_token上面的灯具时,我仍然得到相同的结果
db.session = session
session._test_access_token = create_access_token(identity='pytest')
yield session
Run Code Online (Sandbox Code Playgroud)
在测试期间,如何伪造JWT令牌pytest?
@jwt_required仅在Flask请求的上下文中起作用。您可以使用带有标题名称选项的flask测试客户端发送访问令牌:
def test_foo():
test_client = app.test_client()
access_token = create_access_token('testuser')
headers = {
'Authorization': 'Bearer {}'.format(access_token)
}
response = test_client.get('/foo', headers=headers)
# Rest of test code here
Run Code Online (Sandbox Code Playgroud)
(可选)您可以使用__wrapped__属性来打开装饰方法。在您的情况下,它看起来像:
method_response = get_all_projects.__wrapped__()
Run Code Online (Sandbox Code Playgroud)
请注意,在你的端点烧瓶JWT扩展辅助函数的任何调用(如get_jwt_identity(),current_user等)。不会以这种方式工作,因为它们需要烧瓶请求上下文。您可以通过模拟在函数内部使用的flask-jwt-extended函数来解决此问题,但是随着应用程序的增长和更改,可能难以维护。
在单元测试期间伪造 JWT 令牌的一种选择是修补 jwt_required。更具体地说,修补底层功能verify_jwt_in_request。这模拟了装饰器并消除了为测试创建授权令牌的需要。
from unittest.mock import patch
@patch('flask_jwt_extended.view_decorators.verify_jwt_in_request')
def test_get_all_projects(mock_jwt_required):
# ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2583 次 |
| 最近记录: |