如何使用moto、@mock_dynamodb2模拟失败的操作?

2024-09-29 22:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用Moto&;为我的python代码编写单元测试@模拟发电机2。到目前为止,我一直在努力测试我的“成功操作”测试用例。但我很难让它为我的“失败案例”工作

在我的测试代码中,我有:

@mock_dynamodb2
class TestClassUnderTestExample(unittest.TestCase):
    def setUp(self):
        ddb = boto3.resource("dynamodb", "us-east-1")
        self.table = ddb.create_table(<the table definition)
        self.example_under_test = ClassUnderTestExample(ddb)

    def test_some_thing_success(self):
        expected_response = {<some value>}
        assert expected_response = self.example_under_test.write_entry(<some value>)

    def test_some_thing_success(self):
        response = self.example_under_test.write_entry(<some value>)
        # How to assert exception is thrown by forcing put item to fail? 

TestClassUnderTestExample如下所示:

class ClassUnderTestExample:
   def __init__(self, ddb_resource=None):
        if not ddb_resource:
            ddb_resource = boto3.resource('dynamodb')
        self.table = ddb_resource.Table(.....)

   def write_entry(some_value)
        ddb_item = <do stuff with some_value to create sanitized item>        

        response = self.table.put_item(
            Item=ddb_item
        )

        if pydash.get(response, "ResponseMetadata.HTTPStatusCode") != 200:
            raise SomeCustomErrorType("Unexpected response from DynamoDB when attempting to PutItem")

        return ddb_item

在实际模拟.put_item操作以返回非成功值时,我完全被卡住了,这样我就可以测试ClassUnderTestExample是否会按预期处理它并抛出自定义错误。我尝试过在运行测试之前删除表之类的事情,但这只是在获取表时引发异常,而不是在执行带有错误代码的PutItem时引发异常

我也尝试过为pydash或测试上方的表格添加补丁,但我一定是做错了什么。我在moto的文档中找不到任何东西。任何帮助都将不胜感激


Tags: totestselfvalueexampleresponsedeftable
1条回答
网友
1楼 · 发布于 2024-09-29 22:30:15

Moto的目标是完全模仿AWS的行为,包括用户提供错误输入时的行为。换句话说,调用put_item()如果对AWS失败,那么对Moto也会失败

没有内置方法强制对有效输入进行错误响应

很难从您的示例中看出这是如何强制的,但似乎值得使用这一行来创建无效输入:
ddb_item = <do stuff with some_value to create sanitized item>

相关问题 更多 >

    热门问题