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

如何在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"}

你测试中的两处错误说明

  1. 路由路径错误:你的app.py中定义的路由是/home,但测试里调用的是client.get('/'),这会导致404错误(你之前的401是因为认证拦截,但若路径错误会先触发404)。
  2. 返回值大小写不匹配:app.py中返回的是{"status":"active"}(小写),但测试断言的是{"status": "Active"}(大写),这会导致断言失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:05:06