我想修补 AWS 机密管理器的方法返回。我正在创建一个秘密,然后调用 rotate_secret。因此,一旦轮换发生,list_secret 调用应该返回一个带有键
NextRotationDate
的 JSON 对象。由于 moto 当前未返回密钥,因此我的测试失败了。
这是我要测试的代码-
def list(self):
client: SecretsManagerClient = boto3.client("secretsmanager")
secrets_list = client.list_secrets(
Filters=[
{"Key": "name", "Values": ["test"]},
]
)["SecretList"]
return secrets_list
test.py ->
def test_list(self):
secret_client = boto3.client("secretsmanager")
secret_client.create_secret(
Name="test-secret",
Tags=[
{"Key": "id", "Value": "xyz"}
],
)
secret_client.rotate_secret(
SecretId="test-secret",
RotationRules={'AutomaticallyAfterDays': 30},
RotationLambdaARN=mock_rotation_lambda,
RotateImmediately=True,
)
result = secret_client.list_secrets()
# I add the NextRotationDate manually here to have the correct result
result["SecretList"][0]['NextRotationDate'] = datetime(2024, 1, 1)
with patch.object(secret_client, "list_secrets", return_value=result):
result = sut.test_list()
不知何故
list_secrets
总是在没有所需密钥的情况下返回秘密。我如何以测试列表中的list_secrets
返回我在补丁中传递的结果的方式对其进行修补?
您可以修补 botocore 以拦截请求,并使用该特定字段丰富响应。
import boto3
import botocore
from unittest.mock import patch
from moto import mock_ec2
orig = botocore.client.BaseClient._make_api_call
def mock_make_api_call(self, operation_name, kwarg):
if operation_name == 'ListSecrets':
print("Intercepting... ")
resp = orig(self, operation_name, kwarg)
# Change the response as appropriate
...
return resp
return orig(self, operation_name, kwarg)
def test_list():
...
with patch('botocore.client.BaseClient._make_api_call', new=mock_make_api_call):
result = sut.test_list()
查看文档: https://docs.getmoto.org/en/latest/docs/services/patching_other_services.html