繁体   English   中英

python 中的单元测试未按预期工作

[英]unittest in python not working as expected

我们正在通过TerraformCI/CD方式部署代码。 因此,我们有一个lambda function ,我在该函数下编写了用于检索特定secret凭证的代码。

下面是我的 lambda 代码:

logger = get_provisioner_logger()
session = boto3.session.Session()
client = session.client(
    service_name="secretsmanager",
    region_name=""
)


def lambda_handler(event, context):
    logger.info("lambda invoked with event: " + str(event))
    domain_name = "db-creds"
    secret_data = getCredentials(domain_name)
    acc = secret_data["acc"]
    user = secret_data["user"]
    password = secret_data["pass"]
    #....
    #here we are invoking other methods where we are passing the above creds
    #....
    return handler.handle(event)


def getCredentials(domain_name):
    try:
        response = client.get_secret_value(SecretId=domain_name)
        result = json.loads(response['SecretString'])
        print(result)
        logger.info("Got value for secret %s.", domain_name)
        return result
    except UnableToRetrieveDetails as e:
        logger.error("unable to retrieve secret details due to ", str(e))
        raise e

现在,我已经编写了一个测试用例,我试图模拟客户端并试图伪造响应的返回值,但我无法这样做。 下面是我的代码:

from unittest import TestCase
from unittest.mock import patch
from api.lambda_handler import getCredentials
import json

@patch('api.lambda_handler.client')
class TestSecretManagerMethod(TestCase):

    def test_get_secret_creds(self, sm):
        sm.response.return_value = {"secret":"gotsomecreds"}
        actual = getCredentials("db-creds")
        self.assertEqual(actual, "hey")

它给了我以下错误:

 raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not MagicMock. 

我到底错过了什么?

凯文的回答是正确的。

问题是您混淆了需要修补和返回的内容。

在你的代码中你说:如果你调用client.response()然后返回{"secret":"gotsomecreds"} 问题是这不是您的代码中发生的事情。

您实际上是在调用client.get_secret_value(something) ,这就是需要修补的地方:

@patch('api.lambda_handler.client')
class TestSecretManagerMethod(unittest.TestCase):
    def test_get_secret_creds(self, sm):
        sm.get_secret_value.return_value = {
            "SecretString": '{"secret": "gotsomecreds"}',
        }
        actual = getCredentials("db-creds")
        self.assertEqual(actual, {"secret": "gotsomecreds"})

我还冒昧地修正了断言,因为你设置它的方式"hey"不会被返回。

顺便说一句,我强烈建议您查看moto项目。 它提供了大部分 AWS API 的模拟,将为您节省大量工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM