如何使用moto的@mock_dynamodb2模拟DynamoDB失败操作完成单元测试
解决方案
Moto 原生未提供强制 DynamoDB 操作返回非成功响应的配置,我们可以直接结合 Python 标准库的 unittest.mock 补丁方法,精准控制 put_item 的返回值,命中业务逻辑中的错误判断分支。
步骤实现
- 首先导入 mock 依赖:
from unittest.mock import patch
- 编写失败场景测试用例(注意你原有测试类中两个测试方法重名,需要将失败用例改名):
@mock_dynamodb2 class TestClassUnderTestExample(unittest.TestCase): def setUp(self): ddb = boto3.resource("dynamodb", "us-east-1") self.table = ddb.create_table(<你的表定义>) self.example_under_test = ClassUnderTestExample(ddb) def test_some_thing_success(self): expected_response = {<预期返回值>} assert expected_response == self.example_under_test.write_entry(<测试入参>) def test_some_thing_put_item_fail(self): # 构造携带非200状态码的错误响应 mock_fail_response = { "ResponseMetadata": { "HTTPStatusCode": 500 } } # 补丁被测实例关联的表对象的put_item方法,强制返回我们构造的错误响应 with patch.object(self.example_under_test.table, 'put_item', return_value=mock_fail_response): # 断言调用写入方法时会抛出预期的自定义错误 self.assertRaises(SomeCustomErrorType, self.example_under_test.write_entry, <测试入参>)
原方案踩坑说明
你之前尝试删除表的方式无法达到预期,是因为删表后调用 put_item 会直接触发客户端抛出 ResourceNotFoundException 异常,不会走到你代码中判断返回状态码的分支,不符合测试需求。
如果后续需要测试客户端直接抛出异常的场景,只需要将上面补丁的 return_value 替换为 side_effect,指定要抛出的异常类型即可。
内容的提问来源于stack exchange,提问作者CustardBun
相关产品推荐
相关产品推荐

