我正在尝试从 boto3 s3 客户端对象模拟一个单一方法以引发异常。但我需要所有其他方法才能让这个类正常工作。
这样我就可以在执行 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
方法上抛出异常的任何想法?
最佳答案
Botocore 有一个可以用于此目的的客户端 stub :docs .
下面是一个错误的例子:
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()
这是一个放入正常响应的示例。此外, stub 现在可以在上下文中使用。重要的是要注意, stub 程序将尽可能验证您提供的响应是否与服务实际返回的内容相匹配。这并不完美,但它可以保护您免于插入完全无意义的响应。
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
关于python - 模拟boto3 S3客户端方法Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37143597/