Я обнаружил, что заглушка put_object работает хорошо. В примере 'test_file' должен быть реальным файлом, так как S3Transfer проверяет, существует ли он. S3Transfer будет использовать другие методы обслуживания, если файл, который он передает, достаточно велик, чтобы оправдать загрузку, состоящую из нескольких частей, но его копирование начинает больше походить на написание тестов для S3Transfer, чем на тестирование моего собственного кода.
import botocore.session
from botocore.stub import Stubber, ANY
from boto3.s3.transfer import S3Transfer
s3 = botocore.session.get_session().create_client('s3')
stubber = Stubber(s3)
BUCKET='mock_bucket'
KEY='mock_key'
put_object_response = { 'ETag': '"14fe4f49fffffffffff9afbaaaaaaaa9"',
'ResponseMetadata': { 'HTTPHeaders': { 'content-length': '0',
'date': 'Wed, 08 Apr 2020 '
'20:35:42 GMT',
'etag': '"14fe4f49fffffffffff9afbaaaaaaaa9"',
'server': 'AmazonS3',
},
'HTTPStatusCode': 200,
'HostId': 'GEHrJmjk76Ug/clCVUwimbmIjTTb2S4kU0lLg3Ylj8GKrAIsv5+S7AFb2cRkCLd+mpptmxfubLM=',
'RequestId': 'A8FFFFFFF84C3A77',
'RetryAttempts': 0},
'VersionId': 'Dbc0gbLVEN4N5F4oz7Hhek0Xd82Mdgyo'}
stubber.add_response('put_object', put_object_response,expected_params= {'Body': ANY, 'Bucket':BUCKET,'Key':KEY})
stubber.activate()
transfer = S3Transfer(s3)
transfer.upload_file('test_file', BUCKET,KEY)