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

FastAPI中如何按测试用例局部Mock CheckPermission依赖类?

解决FastAPI中Mock CheckPermission类权限校验的问题

针对你用pytest-fastapi-deps 0.2.3无法MockCheckPermission类或其__call__方法的问题,核心原因通常是Mock路径错误或未匹配FastAPI依赖注入的实际调用逻辑,以下是可行的解决方案:

1. 确认正确的Mock路径

FastAPI的依赖注入会使用路由模块中实际导入的类引用,所以你必须Mock路由文件中导入CheckPermission的完整路径,而非测试文件本地的导入引用。

比如:

  • 若你的路由文件app/routes.py中是from app.permissions import CheckPermission,则Mock路径应为app.routes.CheckPermission,而非app.permissions.CheckPermission。

2. 方案一:用pytest-fastapi-deps直接覆盖类依赖

如果CheckPermission是通过Depends(CheckPermission)作为类依赖注入的,可直接用override_dependency替换整个类的逻辑:

from pytest_fastapi_deps import override_dependency
from app.routes import router  # 导入你的路由实例
from app.permissions import CheckPermission
from app.main import client  # 导入测试用的FastAPI TestClient

# 定义Mock的权限校验逻辑,返回值需匹配原CheckPermission.__call__的返回类型
def mock_check_permission():
    # 示例:返回一个模拟的用户对象或权限校验通过的标识
    return {"user_id": 1, "roles": ["admin"]}

def test_protected_api():
    with override_dependency(CheckPermission, mock_check_permission):
        response = client.get("/your-protected-route")
        assert response.status_code == 200

如果CheckPermission的__call__方法需要接收参数(比如依赖已认证的用户),则Mock函数需对应接收参数:

def mock_check_permission(current_user: dict):
    # 模拟权限校验通过
    return True

3. 方案二:Mock CheckPermission类的__call__方法

如果方案一无效,可直接用unittest.mock.patch精准Mock类的__call__方法,确保路径正确:

from unittest.mock import patch
from app.main import client

def test_protected_api():
    # 注意路径是路由文件中导入的CheckPermission的位置
    with patch("app.routes.CheckPermission.__call__", return_value=True):
        response = client.get("/your-protected-route")
        assert response.status_code == 200

若CheckPermission是通过实例注入的(比如Depends(CheckPermission())),则需Mock实例的__call__方法:

from unittest.mock import patch
from app.permissions import CheckPermission
from app.main import client

def test_protected_api():
    with patch.object(CheckPermission, "__call__", return_value=True):
        response = client.get("/your-protected-route")
        assert response.status_code == 200

4. 常见排查点

  • 检查Mock路径是否与路由中实际使用的类引用一致,可在路由中打印CheckPermission.__module__确认路径。
  • 若CheckPermission的__call__方法有内部依赖,需确保Mock逻辑覆盖了这些依赖(比如同时Mockvalidate_jwt_token)。
  • 确认pytest-fastapi-deps的版本兼容,0.2.3版本对类依赖的覆盖支持可能有限,此时优先用unittest.mock的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:13:12