Mocking boto3 S3 клиентский метод Python

Я пытаюсь высмеять метод singluar из клиентского объекта boto3 s3, чтобы бросить и исключить. Но мне нужны все другие методы, чтобы этот класс работал нормально.

Это значит, что я могу протестировать сингулярный тест на исключение, когда происходит ошибка при выполнении upload_part_copy

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 на 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 ?

  • Python: os.stat (). St_size дает другое значение, чем du
  • Есть ли хороший и простой способ визуализации высокоразмерных данных?
  • Почему эта массив numpy слишком большой для загрузки?
  • Python - групповые дубликаты в списке списков по индексу
  • Как base64 кодирует PDF-файл в Python
  • Удалить цифры в Python (Regex)
  • Как использовать django-debug-toolbar для вызовов AJAX?
  • Разница между вызовами os.system и subprocess
  • 3 Solutions collect form web for “Mocking boto3 S3 клиентский метод Python”

    У Botocore есть клиентский стербер, который вы можете использовать только для этой цели: docs .

    Вот пример ошибки:

     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 

    Как только я опубликовал здесь, мне удалось найти решение. Здесь он надеется, что это поможет 🙂

     import botocore from botocore.exceptions import ClientError from mock import patch import boto3 orig = botocore.client.BaseClient._make_api_call def mock_make_api_call(self, operation_name, kwarg): if operation_name == 'UploadPartCopy': parsed_response = {'Error': {'Code': '500', 'Message': 'Error Uploading'}} raise ClientError(parsed_response, operation_name) return orig(self, operation_name, kwarg) with patch('botocore.client.BaseClient._make_api_call', new=mock_make_api_call): 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() 

    Иордания Philips также опубликовала отличное решение, используя класс botocore.stub.Stubber . В то время как более чистое решение я не мог издеваться над конкретными операциями.

    Вот пример простого элемента управления python, который можно использовать для подделки вызова client = boto3.client ('ec2') api …

     import boto3 class MyAWSModule(): def __init__(self): client = boto3.client('ec2') tags = client.describe_tags(DryRun=False) class TestMyAWSModule(unittest.TestCase): @mock.patch("boto3.client.get_tags") @mock.patch("boto3.client") def test_open_file_with_existing_file(self, mock_boto_client, mock_describe_tags): mock_boto_client.return_value = mock_get_tags_response my_aws_module = MyAWSModule() mock_boto_client.assert_call_once('ec2') mock_describe_tags.assert_call_once_with(DryRun=False) mock_get_tags_response = { 'Tags': [ { 'ResourceId': 'string', 'ResourceType': 'customer-gateway', 'Key': 'string', 'Value': 'string' }, ], 'NextToken': 'string' } 

    надеюсь, это поможет.

    Python - лучший язык программирования в мире.