如何在我的单元测试中模拟一个 ParameterNotFound 异常?

10 浏览
0 Comments

如何在我的单元测试中模拟一个 ParameterNotFound 异常?

我想测试一些错误处理逻辑,所以我想在我的单元测试中模拟特定的异常类型。我正在模拟对boto3的调用,但我希望使该模拟引发一个ParameterNotFound异常。我正在测试的代码遵循这个模式

boto3_client = boto3.client('ssm')
try:
    temp_var = boto3_client.get_parameter(Name="Something not found")['Parameter']['Value']
except boto3_client.exceptions.ParameterNotFound:
    ... [我想要测试的逻辑]

我已经创建了一个unittest的模拟对象,但我不知道如何使它引发ParameterNotFound异常。我尝试了以下方法,但它不起作用,因为在评估except子句时它会得到"异常必须派生自基类"的错误:

@patch('patching_config.boto3.client')
def test_sample(self, mock_boto3_client):
        mock_boto3_client.return_value = mock_boto3_client
        def get_parameter_side_effect(**kwargs):
            raise boto3.client.exceptions.ParameterNotFound()
        mock_boto3_client.get_parameter.side_effect = get_parameter_side_effect

如何在我的单元测试中模拟一个ParameterNotFound的boto3异常?

0
0 Comments

问题的原因是对boto3如何引发异常的误解。解决方法是使用`botocore.exceptions.ClientError`来捕获异常,并在模拟中使用`raise botocore.exceptions.ClientError`来引发`ParameterNotFound`异常。

根据文档,`ClientError`是一个异常类,其属性包括`operation_name`(字符串类型)和`response`(字典类型)。`response`的格式如下所示:

{

"Error": {

"Code": "InvalidParameterValue",

"Message": "The filter 'asdfasdf' is invalid"

},

"ResponseMetadata": {

"RequestId": "aaaabbbb-cccc-dddd-eeee-ffff00001111",

"HTTPStatusCode": 400,

"HTTPHeaders": {

"transfer-encoding": "chunked",

"date": "Fri, 01 Jan 2100 00:00:00 GMT",

"connection": "close",

"server": "AmazonEC2"

},

"RetryAttempts": 0

}

}

根据以上信息,我们可以通过以下步骤来解决问题:

1. 导入`botocore.exceptions.ClientError`模块。

2. 使用`except ClientError`来捕获异常。

3. 在模拟中使用`raise botocore.exceptions.ClientError`来引发`ParameterNotFound`异常,确保`Code`字段的值为`"ParameterNotFound"`。

需要注意的是,根据我的经验,其他答案中提到的`except boto3_client.exceptions.ParameterNotFound`可能已经过时,因为我尝试时得到了"exceptions must derive from the base class"的错误提示。

总结起来,以上方法是我亲自验证有效的解决方法。

0