Skip to content Skip to sidebar Skip to footer

How To Mock A Boto3 Client Object/call

I'm trying to mock one particular boto3 function. My module, Cleanup, imports boto3. Cleanup also has a class, 'cleaner'. During init, cleaner creates an ec2 client: self.ec2_

Solution 1:

I found a solution to this when trying to mock a different method for the S3 client

import botocore
from mock import patch
import boto3

orig = botocore.client.BaseClient._make_api_call

defmock_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 e.g. print args
    e = client.describe_tags()

Hope it helps :)

Solution 2:

You should be mocking with respect to where you are testing. So, if you are testing your cleaner class (Which I suggest you use PEP8 standards here, and make it Cleaner), then you want to mock with respect to where you are testing. So, your patching should actually be something along the lines of:

classSomeTest(Unittest.TestCase):
    @mock.patch('path.to.Cleaner.boto3.client', return_value=Mock())defsetUp(self, boto_client_mock):
        self.cleaner_client = boto_client_mock.return_value

    defyour_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()

I suggest reading through the mocking documentation which has many examples to do what you are trying to do

Post a Comment for "How To Mock A Boto3 Client Object/call"