1

我正在尝试按照文档执行此操作:

@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'
4

1 回答 1

0

好的,我不是 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:调用CreateTopic操作时发生错误(InvalidClientTokenId):请求中包含的安全令牌无效

于 2020-03-08T21:57:33.870 回答