[Python] Moto does not appear to be mocking aws interactions in a pytest

Discussão em 'Python' iniciado por Stack, Maio 26, 2025.

  1. Stack

    Stack Membro Participativo

    Say I want to mock the following:

    session = boto3.Session(profile_name=profile)
    resource = session.resource('iam')
    iam_users = resource.users.all()
    policies = resource.policies.filter(Scope='AWS', OnlyAttached=True, PolicyUsageFilter='PermissionsPolicy')


    How do I go about starting to mock this with in pytest? I could create mocked objects by creating a dummy class and the necessary attributes, but I suspect that's the wrong approach.

    Some additional details, here's what I'm trying to test out:

    def test_check_aws_profile(self, mocker):
    mocked_boto3 = mocker.patch('myapp.services.utils.boto3.Session')
    mocker.patch(mocked_boto3.client.get_caller_identity.get, return_value='foo-account-id')
    assert 'foo-account-id' == my_func('foo')

    #in myapp.services.utils.py
    def my_func(profile):
    session = boto3.Session(profile_name=profile)
    client = session.client('sts')
    aws_account_number = client.get_caller_identity().get('Account')
    return aws_account_number


    But I can't quite seem to be able to get this patched correctly. I'm trying to make it so that I can patch session and the function calls in that method

    I tried using moto and got this:

    @mock_sts
    def test_check_aws_profile(self):
    session = boto3.Session(profile_name='foo')
    client = session.client('sts')
    client.get_caller_identity().get('Account')


    But I'm running into

    > raise ProfileNotFound(profile=profile_name)
    E botocore.exceptions.ProfileNotFound: The config profile (foo) could not be found


    So it seems like it's not mocking anything :|

    Edit:

    Turns out you need to have the mocked credentials in a config and credentials file for this to work.

    Continue reading...

Compartilhe esta Página