boto3 s3 クライアント オブジェクトから単一のメソッドをモックして例外をスローしようとしています。ただし、このクラスの他のすべてのメソッドが正常に動作する必要があります。
これは、実行中にエラーが発生したときに単一の例外テストをテストできるようにするためです。アップロード部分コピー
1回目の試み
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
2回目の試み
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
方法について何かアイデアはありますか?
ベストアンサー1
Botocore には、まさにこの目的に使用できるクライアント スタッバーがあります。ドキュメント。
以下にエラーを入力する例を示します。
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