首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flask-jwt-extended:测试过程中的假Authorization Header (pytest)

flask-jwt-extended:测试过程中的假Authorization Header (pytest)
EN

Stack Overflow用户
提问于 2017-10-20 18:02:55
回答 5查看 8.4K关注 0票数 13

这是我想要测试的函数

代码语言:javascript
复制
@jwt_required
    def get_all_projects(self):
        # implementation not included here

我从pytest类调用函数。

代码语言:javascript
复制
def test_get_all_projects(db_session):
    all_projects = ProjectController.get_all_projects()

使用db_session fixture

代码语言:javascript
复制
@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()

这会导致错误

代码语言:javascript
复制
>           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

手动调用create_access_token

当我在上面的fixture中调用create_access_token时,我仍然得到相同的结果

代码语言:javascript
复制
db.session = session
session._test_access_token = create_access_token(identity='pytest')

yield session

如何在使用pytest进行测试期间伪造JWT令牌

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-10-20 23:32:36

@jwt_required仅适用于Flask请求的上下文。您可以使用带headers name选项的flask测试客户端发送访问令牌:

代码语言:javascript
复制
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

或者,您可以使用__wrapped__属性对修饰方法进行解包。在您的示例中,它将如下所示:

代码语言:javascript
复制
method_response = get_all_projects.__wrapped__()

请注意,对端点(如get_jwt_identity()current_user等)中的flask-jwt扩展帮助器函数的任何调用。不会以这种方式工作,因为它们需要flask请求上下文。您可以通过模拟函数内部使用的flask-jwt扩展函数来解决此问题,但随着应用程序的增长和更改,这可能更难维护。

票数 17
EN

Stack Overflow用户

发布于 2019-08-22 23:42:13

在单元测试期间伪造JWT令牌的一种选择是为jwt_required打补丁。更具体地说,修补底层函数verify_jwt_in_request。这模拟了装饰器,并消除了为测试创建授权令牌的需要。

代码语言:javascript
复制
from unittest.mock import patch


@patch('flask_jwt_extended.view_decorators.verify_jwt_in_request')
def test_get_all_projects(mock_jwt_required):
    # ...
票数 8
EN

Stack Overflow用户

发布于 2018-12-05 07:12:54

这是我最终做的事情,并为我工作。在conftest.py中:

代码语言:javascript
复制
@pytest.yield_fixture(scope='function')
def app():
  _app = create_app(TestConfig)
  ctx = _app.test_request_context()
  ctx.push()

  yield _app

  ctx.pop()

@pytest.fixture(scope='function')
def testapp(app):
    """A Webtest app."""
    testapp = TestApp(app)

    with testapp.app.test_request_context():
        access_token = create_access_token(identity=User.query.filter_by(email='test@test.com').first(), expires_delta=False, fresh=True)
    testapp.authorization = ('Bearer', access_token)

    return testapp

然后在您的TestConfig中,为flask jwt-extended设置以下标志:

代码语言:javascript
复制
JWT_HEADER_TYPE = 'Bearer'
JWT_BLACKLIST_ENABLED = False
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46846762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档