boto3 S3クライアントメソッドのモック Python 質問する

boto3 S3クライアントメソッドのモック Python 質問する

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

おすすめ記事