You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:01:11