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

如何使用moto的@mock_dynamodb2模拟DynamoDB失败操作完成单元测试

解决方案

Moto 原生未提供强制 DynamoDB 操作返回非成功响应的配置,我们可以直接结合 Python 标准库的 unittest.mock 补丁方法,精准控制 put_item 的返回值,命中业务逻辑中的错误判断分支。

步骤实现

  1. 首先导入 mock 依赖:
from unittest.mock import patch
  1. 编写失败场景测试用例(注意你原有测试类中两个测试方法重名,需要将失败用例改名):
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:06:00