FastAPI依赖覆盖与测试环境模拟
title: FastAPI依赖覆盖与测试环境模拟


# 生产环境数据库连接
async def get_db():
return RealDatabase()
# 测试环境内存数据库
async def mock_db():
return MockDatabase()
# conftest.py
import pytest
from fastapi.testclient import TestClient
from main import app
@pytest.fixture(scope="module")
def test_client():
# 覆盖数据库依赖
from main import get_db
app.dependency_overrides[get_db] = lambda: "sqlite:///:memory:"
with TestClient(app) as client:
yield client
# 测试结束后清除覆盖
app.dependency_overrides.clear()
# 生产环境权限验证
def get_current_user(token: str = Depends(oauth2_scheme)):
return UserService.verify_token(token)
# 测试用例覆盖
def override_user():
return User(id=999, role='admin')
# 测试执行
def test_admin_operation(test_client):
app.dependency_overrides[get_current_user] = override_user
response = test_client.get("/admin")
assert response.status_code == 200
# 原始支付接口
async def payment_gateway(amount: float):
response = await call_real_payment_api(amount)
return response
# 模拟支付接口
async def mock_payment(amount: float):
return {"status": "success", "txid": "TEST123"}
# 测试用例
def test_payment_process(test_client):
app.dependency_overrides[payment_gateway] = mock_payment
payload = {"amount": 100.0}
response = test_client.post("/pay", json=payload)
assert response.json()["txid"].startswith("TEST")
| 测试类型 | 覆盖目标 | 模拟策略 |
|---|---|---|
| 单元测试 | 单个业务逻辑 | Mock所有外部依赖 |
| 集成测试 | 模块间交互 | 模拟部分外部服务 |
| E2E测试 | 完整业务流程 | 使用测试环境专用配置 |
# 使用pytest参数化进行多场景测试
@pytest.mark.parametrize("user_role, expected_status", [
("admin", 200),
("user", 403),
("guest", 401)
])
def test_role_based_access(test_client, user_role, expected_status):
# 动态生成模拟用户
def override_role():
return User(role=user_role)
app.dependency_overrides[get_current_user] = override_role
response = test_client.get("/dashboard")
assert response.status_code == expected_status
fastapi.exceptions.DependencyOverrideNotFound:
Dependency not found for override
AssertionError: 422 != 200
class BaseUserModel(pydantic.BaseModel):
id: int
role: str
def validate_user(user: Any) -> BaseUserModel:
return BaseUserModel.parse_obj(user)
评论
发表评论