Cómo burlarse de un objeto / llamada boto3 cliente

Estoy tratando de burlarme de una función particular de boto3. Mi módulo, Limpieza, importa boto3. La limpieza también tiene una clase, “limpia”. Durante init, cleaner crea un cliente ec2:

self.ec2_client = boto3.client('ec2') 

Quiero burlarme del método del cliente ec2: desribe_tags (), que Python dice que es:

 <bound method EC2.describe_tags of > 

lo más lejos que he conseguido es importar botocore en mi archivo de prueba y probar:

 mock.patch(Cleaner.botocore.client.EC2.describe_tags) 

que falla con:

 AttributeError: 'module' object has no attribute 'EC2' 

¿Cómo me burlo de este método?

La limpieza se ve como:

 import boto3 class cleaner(object): def __init__(self): self.ec2_client = boto3.client('ec2') 

El objeto ec2_client es el que tiene el método desribe_tags (). Es un objeto botocore.client.EC2, pero nunca importo directamente botocore.

Encontré una solución a esto al intentar simular un método diferente para el cliente S3

 import botocore 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 == 'DescribeTags': # Your Operation here! print(kwarg) return orig(self, operation_name, kwarg) with patch('botocore.client.BaseClient._make_api_call', new=mock_make_api_call): client = boto3.client('ec2') # Calling describe tags will perform your mocked operation eg print args e = client.describe_tags() 

Espero eso ayude 🙂

Debería estar burlándose con respecto a donde está realizando la prueba. Entonces, si está probando su clase de cleaner (lo cual sugiero que use los estándares de PEP8 aquí, y lo haga más Cleaner ), entonces usted quiere burlarse con respecto a dónde está realizando la prueba. Entonces, su parche debería ser algo como :

 class SomeTest(Unittest.TestCase): @mock.patch('path.to.Cleaner.boto3.client', return_value=Mock()) def setUp(self, boto_client_mock): self.cleaner_client = boto_client_mock.return_value def your_test(self): # call the method you are looking to test here # simple test to check that the method you are looking to mock was called self.cleaner_client.desribe_tags.assert_called_with() 

Le sugiero leer la documentación burlona que tiene muchos ejemplos para hacer lo que está tratando de hacer.