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

FastAPI单元测试中DynamoDB的get_item方法Mock失败求助

解决FastAPI单元测试中Mock DynamoDB get_item无效的问题

问题根源

你的测试代码存在两个核心错误:

  1. MockAppConfig依然实例化了真实的DynamoDBRepository,导致测试还是会调用真实数据库
  2. 错误地将get_item方法直接赋值为字典,而get_item是需要模拟的方法,应该用Mock对象来定义返回逻辑

解决方案

方案一:通过依赖覆盖替换Mock仓库实例

这种方式直接替换掉AppConfig中的真实仓库,从根源上避免调用真实DB:

from unittest.mock import MagicMock
from fastapi.testclient import TestClient
# 替换成你的实际模块路径
from your_project import fast_api_app, AppConfig

client = TestClient(fast_api_app)

def test_get_request():
    # 创建Mock的DynamoDBRepository
    mock_repo = MagicMock()
    # 模拟get_item的返回值,匹配业务代码的返回结构(带"Item"键)
    mock_repo.get_item.return_value = {
        "Item": {
            "id": "1234",
            "title": "Foo",
            "description": "Hello"
        }
    }
    
    # 定义替代AppConfig的依赖函数
    def mock_app_config():
        config = type('MockAppConfig', (), {})()
        config._dynamodb_repository = mock_repo
        return config
    
    # 覆盖FastAPI的依赖
    fast_api_app.dependency_overrides[AppConfig] = mock_app_config
    
    # 发起请求
    response = client.get("/object/1234")
    
    # 断言结果
    assert response.status_code == 200
    assert response.json() == {
        "id": "1234",
        "title": "Foo",
        "description": "Hello"
    }
    
    # 验证get_item是否被正确调用
    mock_repo.get_item.assert_called_once_with({"object_id": "1234"})
    
    # 清除依赖覆盖,避免影响其他测试
    fast_api_app.dependency_overrides.clear()

方案二:用unittest.mock.patch直接Mock get_item方法

直接patch真实DynamoDBRepository的get_item方法,无需修改依赖结构:

from unittest.mock import patch
from fastapi.testclient import TestClient
# 替换成你的实际模块路径
from your_project import fast_api_app

client = TestClient(fast_api_app)

def test_get_request():
    # 注意:patch路径必须是AppConfig中导入DynamoDBRepository的路径(即file_1中的类)
    with patch("file_1.DynamoDBRepository.get_item") as mock_get_item:
        # 设置模拟返回值
        mock_get_item.return_value = {
            "Item": {
                "id": "1234",
                "title": "Foo",
                "description": "Hello"
            }
        }
        
        # 发起请求
        response = client.get("/object/1234")
        
        # 断言结果
        assert response.status_code == 200
        assert response.json() == {
            "id": "1234",
            "title": "Foo",
            "description": "Hello"
        }
        
        # 验证调用参数是否正确
        mock_get_item.assert_called_once_with({"object_id": "1234"})

关键注意点

  • Patch路径正确性:使用patch时,必须针对被业务代码实际导入和使用的类路径,而不是测试文件中导入的路径,否则Mock不会生效
  • 返回值结构匹配:业务代码中get_item返回的是包含"Item"键的字典,所以Mock的返回值必须和这个结构一致,否则会抛出KeyError
  • 清理依赖覆盖:使用方案一时,测试结束后要清除dependency_overrides,避免影响其他测试用例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:30:52