gpt4 book ai didi

python - 在 python Flask 应用程序中进行单元测试时如何避免装饰器

转载 作者:太空宇宙 更新时间:2023-11-03 21:47:17 25 4
gpt4 key购买 nike

我是Python和Flask的新手。我想为编写的 api 创建单元测试。我们使用 jwt 进行身份验证。

为了进行单元测试,我不希望流程进入 @jwt_required 装饰器。除此之外,我还为该方法链接了一些其他装饰器。

class A():

@jwt_required()
@mandatory_fields_check
@unlock_and_lock()
def get(self, address, name):
..
..
..
return jsonify(
{"payload": data,
"message": "data received successfully"}), 200

我正在尝试编写单元测试

def test_get():
a_obj = A()
a_obj.get("address123", 'xyz')

当我使用 py.test 运行上述测试时,出现运行时错误

    def _find_app():
top = _app_ctx_stack.top
if top is None:
raise RuntimeError(_app_ctx_err_msg)
RuntimeError: Working outside of application context.
E
E This typically means that you attempted to use functionality that needed
E to interface with the current application object in some way. To solve
E this, set up an application context with app.app_context(). See the
E documentation for more information.

以下是我的目标:

  1. 我不希望流程进入装饰器逻辑

  2. Jwt 装饰器正在请求上下文。然而,我的目的是将此方法作为普通类方法进行单元测试,而不需要任何 Flask 功能。

  3. 如何模拟在被测方法内创建的对象?

最佳答案

不要尝试模拟装饰器,而是模拟装饰器正在调用的函数。

我在使用flask_jwt_extend时遇到了类似的障碍,我想模拟jwt_required装饰器。

@jwt_required
def post(payload)
....

而不是

mock.patch('flask_jwt_extended.jwt_required')

我查看了 jwt_required 装饰器调用的函数(在本例中是 flask_jwt_extended.view_decorators 中的 verify_jwt_in_request)。所以,

mock.patch('flask_jwt_extended.view_decorators.verify_jwt_in_request')

成功了!

关于python - 在 python Flask 应用程序中进行单元测试时如何避免装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52400853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com