如何验证FastAPI缓存生效?缓存复用测试遇断言失败问题
解决FastAPI Cache缓存未生效导致重复调用POST的测试问题
你的测试断言失败核心原因是FastAPI Cache默认未启用适合测试的缓存后端,导致两次调用get_auth_token都执行了原函数内的POST请求逻辑;另外你提供的示例代码未正确mock实际的POST请求对象,也是问题诱因之一。
解决步骤及修正代码
1. 配置测试用内存缓存后端
测试阶段使用InMemoryCache(内存缓存),无需依赖外部服务,且能快速验证缓存逻辑。
2. 正确Mock原函数中的POST请求
确保mock的是get_auth_token内实际调用的POST请求对象(比如httpx.AsyncClient.post),路径必须和原函数中的引用一致。
3. 测试前后初始化/清理缓存
避免测试用例间的缓存污染,在测试开始前初始化缓存,结束后清空。
from fastapi_cache import FastAPICache from fastapi_cache.backends.inmemory import InMemoryCache from fastapi_cache.decorator import cache from unittest import IsolatedAsyncioTestCase from unittest.mock import patch, AsyncMock import httpx # 假设原函数用httpx发送POST请求 @cache(expire=60) async def get_auth_token() -> str: # 原函数内实际的POST请求逻辑示例 async with httpx.AsyncClient() as client: response = await client.post("https://auth.example.com/token") return response.json()["access_token"] class TestAuth(IsolatedAsyncioTestCase): async def setUpAsync(self): # 初始化内存缓存后端 FastAPICache.init(InMemoryCache()) async def tearDownAsync(self): # 测试结束后清空缓存 await FastAPICache.clear() async def test_get_token_success(self): # Mock httpx的POST请求方法 with patch("httpx.AsyncClient.post", new_callable=AsyncMock) as mock_post: # 设置mock的返回值 mock_post.return_value.json.return_value = {"access_token": "token"} # 第一次调用:执行原函数逻辑,触发POST请求 _token = await get_auth_token() assert _token == "token" mock_post.assert_called_once() # 第二次调用:复用缓存,不执行原函数及POST请求 _token = await get_auth_token() assert _token == "token" # 断言POST请求仅被调用一次 mock_post.assert_called_once()
关键说明
setUpAsync和tearDownAsync分别负责缓存的初始化与清理,保证测试环境隔离patch的路径必须精确匹配原函数中使用的POST请求对象,否则mock不会生效- 启用内存缓存后,第二次调用
get_auth_token会直接返回缓存值,不会触发原函数内的POST请求
内容的提问来源于stack exchange,提问作者Carlos Rojas
相关产品推荐
相关产品推荐

