我试图从 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?