模拟boto3 S3客户端方法Python

2024-04-16

我试图从 boto3 s3 客户端对象模拟一个单一方法来抛出异常。但我需要所有其他方法才能使此类正常工作。

这样我就可以在执行时发生错误时测试单个异常测试上传部分复制 http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.upload_part_copy

第一次尝试

import boto3
from mock import patch

with patch('botocore.client.S3.upload_part_copy', side_effect=Exception('Error Uploading')) as mock:
    client = boto3.client('s3')
    # Should return actual result
    o = client.get_object(Bucket='my-bucket', Key='my-key')
    # Should return mocked exception
    e = client.upload_part_copy()

但这会产生以下错误:

ImportError: No module named S3

第二次尝试

查看 botocore.client.py 源代码后,我发现它正在做一些聪明的事情和方法upload_part_copy不存在。我发现它好像在调用BaseClient._make_api_call相反,所以我试图嘲笑它

import boto3
from mock import patch

with patch('botocore.client.BaseClient._make_api_call', side_effect=Exception('Error Uploading')) as mock:
    client = boto3.client('s3')
    # Should return actual result
    o = client.get_object(Bucket='my-bucket', Key='my-key')
    # Should return mocked exception
    e = client.upload_part_copy()

这会引发异常......但是在get_object我想避免。

关于我如何只能抛出异常的任何想法upload_part_copy method?


Botocore 有一个客户端存根,您可以将其用于此目的:docs http://botocore.readthedocs.io/en/latest/reference/stubber.html.

下面是一个输入错误的例子:

import boto3
from botocore.stub import Stubber

client = boto3.client('s3')
stubber = Stubber(client)
stubber.add_client_error('upload_part_copy')
stubber.activate()

# Will raise a ClientError
client.upload_part_copy()

这是放入正常响应的示例。此外,存根现在可以在上下文中使用。值得注意的是,存根程序将尽可能验证您提供的响应是否与服务实际返回的内容相匹配。这并不完美,但它可以防止您插入完全无意义的回复。

import boto3
from botocore.stub import Stubber

client = boto3.client('s3')
stubber = Stubber(client)
list_buckets_response = {
    "Owner": {
        "DisplayName": "name",
        "ID": "EXAMPLE123"
    },
    "Buckets": [{
        "CreationDate": "2016-05-25T16:55:48.000Z",
        "Name": "foo"
    }]
}
expected_params = {}
stubber.add_response('list_buckets', list_buckets_response, expected_params)

with stubber:
    response = client.list_buckets()

assert response == list_buckets_response
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟boto3 S3客户端方法Python 的相关文章

随机推荐