如何在pytest中Mock Flask应用的认证装饰器?
正确Mock Flask认证装饰器的解决方案
你的测试出现401错误,核心原因是Flask路由的装饰器在模块导入阶段就已执行完毕:当你导入app时,/home路由已经被原token_required装饰器包装完成,后续再patchauth.token_required不会对已装饰的路由生效。结合你的代码,这里提供两种可行方案,同时修正你测试中的两处错误(路由路径、返回值大小写):
方案一:Mock verify_token函数,跳过认证校验
直接让verify_token始终返回True,这样即使token_required正常执行,也会通过认证:
import pytest from app import app as flask_app from unittest.mock import patch @pytest.fixture def app(): yield flask_app @pytest.fixture def client(app): with app.test_client() as client: yield client @patch('auth.verify_token') def test_home_endpoint(mock_verify_token, client): # 让验证函数始终返回True mock_verify_token.return_value = True # 注意路由是/home,不是/ response = client.get('/home') assert response.status_code == 200 # 注意返回的status是小写active,不是大写Active assert response.json == {"status": "active"}
方案二:Patch app模块中的token_required引用,让装饰器失效
因为app.py中是from auth import token_required,所以要patchapp模块内的token_required引用,让装饰器直接返回原函数,不做认证包装:
import pytest from unittest.mock import patch from app import app as flask_app @pytest.fixture def app(): # patch app模块里的token_required,让装饰器原样返回函数 with patch('app.token_required') as mock_token_required: mock_token_required.side_effect = lambda f: f yield flask_app @pytest.fixture def client(app): with app.test_client() as client: yield client def test_home_endpoint(client): response = client.get('/home') assert response.status_code == 200 assert response.json == {"status": "active"}
你测试中的两处错误说明
- 路由路径错误:你的
app.py中定义的路由是/home,但测试里调用的是client.get('/'),这会导致404错误(你之前的401是因为认证拦截,但若路径错误会先触发404)。 - 返回值大小写不匹配:
app.py中返回的是{"status":"active"}(小写),但测试断言的是{"status": "Active"}(大写),这会导致断言失败。
内容的提问来源于stack exchange,提问作者JITHU PRAKASH
相关产品推荐
相关产品推荐

