You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为带flask_azure_oauth认证的Flask蓝图端点编写单元测试遇阻求助

解决Flask蓝图中flask_azure_oauth认证装饰器的单元测试问题

你的问题核心是mock的对象不对:你mock了FlaskAzureOauth类的init_app方法,但实际生效的是api.helpers.flask_oauth模块中已经实例化的auth对象,它的装饰器逻辑(@auth('role')对应的__call__方法)并没有被mock,导致测试时仍然会执行认证检查,进而失败。

可行解决方案

直接mock已实例化的auth对象的装饰器行为,让它跳过认证逻辑,直接返回被装饰的视图函数。具体步骤如下:

  1. 在测试中patchapi.helpers.flask_oauth.auth这个实例的__call__方法,让它接收角色参数后返回一个直接返回原函数的装饰器。
  2. 确保mock在视图函数导入前生效,或者在测试函数中动态patch。

修改后的测试代码示例

import pytest
from unittest.mock import patch
from main import create_app


@pytest.fixture()
def app():
    # 提前patch auth实例的__call__方法,让装饰器直接返回原函数
    with patch('api.helpers.flask_oauth.auth') as mock_auth:
        # 配置mock:当调用auth('role')时,返回一个装饰器,该装饰器直接返回传入的函数
        mock_auth.__call__.return_value = lambda func: func
        app = create_app()
        yield app


@pytest.fixture()
def client(app):
    return app.test_client()


def test_get_todolist(client):
    response = client.get("/api/todolist")
    assert response.status_code == 200
    assert 'description' in response.json[0]

关键说明

  • patch('api.helpers.flask_oauth.auth'):精准定位到你在蓝图中导入的那个auth实例,而不是FlaskAzureOauth类本身。
  • mock_auth.__call__.return_value = lambda func: func:模拟装饰器的行为——当用@auth('role')装饰视图时,这个lambda直接返回原视图函数,完全跳过认证检查。
  • 把patch放在app fixture中,确保在create_app导入蓝图(进而导入视图函数和auth装饰器)之前,mock已经生效。

额外提示

你的todolist_dummy.py代码中缺少import json,虽然你说运行正常,但建议补全以避免潜在问题。

内容的提问来源于stack exchange,提问作者Roland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:12:54