FastAPI单元测试中DynamoDB的get_item方法Mock失败求助
解决FastAPI单元测试中Mock DynamoDB get_item无效的问题
问题根源
你的测试代码存在两个核心错误:
MockAppConfig依然实例化了真实的DynamoDBRepository,导致测试还是会调用真实数据库- 错误地将
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
相关产品推荐
相关产品推荐

