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

如何验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:35:16