moto sns клиент не может вызвать create_topi c AttributeError: у объекта 'generator' нет атрибута 'create_topi c' - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь следовать документам, чтобы сделать это:

@pytest.fixture()
def aws_credentials():
    """Mocked AWS Credentials for moto."""
    os.environ["AWS_ACCESS_KEY_ID"] = "testing"
    os.environ["AWS_SECRET_ACCESS_KEY"] = "testing"
    os.environ["AWS_SECURITY_TOKEN"] = "testing"
    os.environ["AWS_SESSION_TOKEN"] = "testing"


@pytest.fixture()
def sts(aws_credentials):
    with mock_sts():
        yield boto3.client("sts", region_name="us-east-1")


@pytest.fixture
def sns(aws_credentials):
    with mock_sns():
        yield boto3.resource("sns", region_name="us-east-1")


def test_publish(sns):
    resp = sns.create_topic(Name="sdfsdfsdfsd")

Я получаю сообщение об ошибке:

    def test_publish(sns):
>       topic_arn = sns.create_topic(Name="sdfsdfsdfsd")
E       AttributeError: 'generator' object has no attribute 'create_topic'

1 Ответ

0 голосов
/ 09 марта 2020

ОК, я не уверен на 100%, почему, но добавление декоратора sts, кажется, исправило это

@mock_sts
def test_publish(sns):
    resp = sns.create_topic(Name="sdfsdfsdfsd")

Я понял это из этой статьи, но мне все еще неясно, как это работает: https://www.serverlessops.io/blog/aws-lambda-serverless-development-workflow-part2-testing-debugging

Это из-за того, что boto должен использовать sts, поэтому мне тоже нужно это смоделировать? я использую файл учетных данных с профилями для доступа к aws с ноутбука

РЕДАКТИРОВАТЬ: Вы также ДОЛЖНЫ использовать yield для возврата клиента. Использование return здесь дало мне ошибку sts. Мне бы тоже хотелось это лучше понять. Я предполагаю, что мне нужно использовать yield, потому что это генератор?

@pytest.fixture
def sns(aws_credentials):
    with mock_sns():
        # using return here causes below error
        return boto3.resource("sns", region_name="us-east-1")

Ошибка, когда не используется yield

botocore.exceptions.ClientError: An error occurred (InvalidClientTokenId) when calling the CreateTopic operation: The security token included in the request is invalid
...