我正在尝试模拟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
方法中抛出异常吗?
client
注入到待测试的单元中吗?我理解的Python单元测试是,测试人员使用类似于unittest.mock
的东西来模拟导入的依赖项。这种方法是否会模拟在其他文件中导入的boto客户端? - Carl G~/.aws
目录中的配置文件不存在。它适用于没有这些文件的S3,但不适用于大多数其他AWS服务。因此,我建议不要使用存根。 - Asclepius