为带flask_azure_oauth认证的Flask蓝图端点编写单元测试遇阻求助
解决Flask蓝图中flask_azure_oauth认证装饰器的单元测试问题
你的问题核心是mock的对象不对:你mock了FlaskAzureOauth类的init_app方法,但实际生效的是api.helpers.flask_oauth模块中已经实例化的auth对象,它的装饰器逻辑(@auth('role')对应的__call__方法)并没有被mock,导致测试时仍然会执行认证检查,进而失败。
可行解决方案
直接mock已实例化的auth对象的装饰器行为,让它跳过认证逻辑,直接返回被装饰的视图函数。具体步骤如下:
- 在测试中patch
api.helpers.flask_oauth.auth这个实例的__call__方法,让它接收角色参数后返回一个直接返回原函数的装饰器。 - 确保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放在
appfixture中,确保在create_app导入蓝图(进而导入视图函数和auth装饰器)之前,mock已经生效。
额外提示
你的todolist_dummy.py代码中缺少import json,虽然你说运行正常,但建议补全以避免潜在问题。
内容的提问来源于stack exchange,提问作者Roland
相关产品推荐
相关产品推荐

