pytest 方法调用的补丁返回类型

问题描述 投票:0回答:1

我想修补 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
返回我在补丁中传递的结果的方式对其进行修补?

python pytest python-unittest moto
1个回答
0
投票

您可以修补 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

© www.soinside.com 2019 - 2024. All rights reserved.