Solución:
Botocore tiene un stubber de cliente que puede usar para este propósito: docs.
A continuación, se muestra un ejemplo de cómo poner un error en:
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()
Aquí hay un ejemplo de cómo poner una respuesta normal. Además, el stubber ahora se puede usar en un contexto. Es importante tener en cuenta que el stubber verificará, en la medida de lo posible, que la respuesta proporcionada coincida con lo que realmente devolverá el servicio. Esto no es perfecto, pero lo protegerá de insertar respuestas totalmente sin sentido.
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
Tan pronto como publiqué aquí, logré encontrar una solución. Aquí está la esperanza de que ayude 🙂
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()
Jordan Philips también publicó una gran solución utilizando la clase botocore.stub.Stubber. Si bien era una solución más limpia, no pude burlarme de operaciones específicas.
Aquí hay un ejemplo de una prueba unitaria de Python simple que se puede usar para falsificar cliente = boto3.client (‘ec2’) llamada 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_describe_tags.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'
}
espero que eso ayude.