这是我想要测试的函数
@jwt_required
def get_all_projects(self):
# implementation not included here我从pytest类调用函数。
def test_get_all_projects(db_session):
all_projects = ProjectController.get_all_projects()使用db_session fixture
@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()这会导致错误
> 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时,我仍然得到相同的结果
db.session = session
session._test_access_token = create_access_token(identity='pytest')
yield session如何在使用pytest进行测试期间伪造JWT令牌
发布于 2017-10-20 23:32:36
@jwt_required仅适用于Flask请求的上下文。您可以使用带headers name选项的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或者,您可以使用__wrapped__属性对修饰方法进行解包。在您的示例中,它将如下所示:
method_response = get_all_projects.__wrapped__()请注意,对端点(如get_jwt_identity()、current_user等)中的flask-jwt扩展帮助器函数的任何调用。不会以这种方式工作,因为它们需要flask请求上下文。您可以通过模拟函数内部使用的flask-jwt扩展函数来解决此问题,但随着应用程序的增长和更改,这可能更难维护。
发布于 2019-08-22 23:42:13
在单元测试期间伪造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):
# ...发布于 2018-12-05 07:12:54
这是我最终做的事情,并为我工作。在conftest.py中:
@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设置以下标志:
JWT_HEADER_TYPE = 'Bearer'
JWT_BLACKLIST_ENABLED = Falsehttps://stackoverflow.com/questions/46846762
复制相似问题