我有一个 click cli 应用程序,我正在尝试模拟 AWS SSM Parameter Store,但 runner.invoke 没有返回预期结果。
这是test_demo.py
:
from click.testing import CliRunner
import os
import boto3
from moto import mock_ssm
import pytest
@pytest.fixture(scope='package')
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'
os.environ['AWS_DEFAULT_REGION'] = 'us-west-2'
@pytest.fixture(scope='package')
def ssm(aws_credentials):
with mock_ssm():
yield boto3.client('ssm')
def test_get_mock_ssm(ssm):
# We need to create the ssm entry first since this is all in Moto's 'virtual' AWS account
ssm.put_parameter(
Name='test',
Description='name',
Value='text',
Type='String',
Overwrite=True,
Tier='Standard',
DataType='text'
)
out = ssm.get_parameter(Name='test')
print('without cli')
print(out)
from src.cli import entrypoint
runner = CliRunner()
response = runner.invoke(entrypoint, ["get", "--name", "test"])
print('with cli')
print(response)
assert response.exit_code == 0
测试结果如下:
without cli
{'Parameter': {'Name': 'test', 'Type': 'String', 'Value': 'text', 'Version': 1, 'LastModifiedDate': datetime.datetime(2020, 5, 31, 9, 3, 21, 920000, tzinfo=tzlocal()), 'ARN': 'arn:aws:ssm:us-west-2:1234567890:parameter/test'}, 'ResponseMetadata': {'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'amazon.com'}, 'RetryAttempts': 0}}
with cli
<Result okay>
PASSED
我希望 cli 的输出与无 cli 相同。
点击代码:
import click
import manage_secrets
@click.group()
def entrypoint():
pass
@entrypoint.command()
@click.option('--name', required=True,
help='Name of parameter to get value from SSM')
def get(name):
"""get secrets"""
click.echo("getting value of: {0}" .format(name))
print(manage_secrets.get_value_from_parameter_store(name))
if __name__ == "__main__":
entrypoint()
manage_secrets 代码:
import boto3
parameter_name = None
def get_value_from_parameter_store(name):
client = boto3.client('ssm')
try:
parameter = client.get_parameter(Name=name, WithDecryption=True)
return parameter
except client.exceptions.ParameterNotFound:
print("parameter not found")
我添加了一个返回值,它只是默认值,而不是解析,我认为 ssm.get_parameter 是一样的。我不确定我错过了什么。任何指示或建议?