Python单元测试Mock SecretsManager失败:Lambda凭据测试报错排查
问题分析与修复
你的单元测试失败主要有3个关键错误:
1. Mock的方法名错误
你在测试里用了sm.response.return_value,但Lambda代码里调用的是SecretsManager客户端的get_secret_value方法,应该Mock这个实际被调用的方法,而非不存在的response方法。
2. 返回结构不符合Lambda的解析逻辑
Lambda的getCredentials函数会先读取response['SecretString'],再用json.loads解析该字段。你当前的Mock结构错误,导致response['SecretString']是一个MagicMock对象,json.loads无法解析非字符串类型的对象,因此抛出类型错误。正确做法是让Mock的get_secret_value返回包含SecretString字段的字典,且该字段为JSON格式的字符串。
3. 断言的预期值与实际返回不匹配
你断言actual等于字符串"hey",但按照Mock的返回逻辑,实际返回的是解析后的字典,两者完全不匹配,即使修复前两个问题,这个断言也会失败。
修正后的测试代码
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): # 构造符合Lambda解析逻辑的返回值:SecretString是JSON格式字符串 mock_secret_str = json.dumps({"acc": "test_acc", "user": "test_user", "pass": "test_pass"}) sm.get_secret_value.return_value = {"SecretString": mock_secret_str} actual = getCredentials("db-creds") # 断言实际返回的解析后字典与构造内容一致 self.assertEqual(actual, {"acc": "test_acc", "user": "test_user", "pass": "test_pass"})
额外提示
- 如果Lambda代码中的
logger在测试环境未初始化,可能需要额外Mockget_provisioner_logger(),避免日志模块报错。 - 可补充异常测试:模拟
get_secret_value抛出异常,验证函数是否正确捕获并重新抛出UnableToRetrieveDetails。
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

