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

CDK执行Snapshot快照测试生成空对象的原因及解决方法

快照为空的原因

  • 根栈选择错误:测试代码中先实例化了一个空的Stack作为父容器,再把SNSStack作为子堆栈挂载到它下面,调用SynthUtils.toCloudFormation(stack)时仅导出了外层空栈的CloudFormation模板,自然返回空对象。
  • 类型与参数不匹配:
    • 你定义的SNSStack构造函数入参props声明的类型是AssumedRole,和预先定义的SNSStackProps接口不一致
    • 测试代码里传入的参数名是assumedRoleArn,但接口中定义的字段是assumedRole,参数传递错误会导致栈构造逻辑异常。

修复方案

1. 修正堆栈定义的类型错误

将构造函数的props类型改为你定义的SNSStackProps:

export interface SNSStackProps extends cdk.StackProps {
  assumedRole: string
}

export class SNSStack extends cdk.Stack {
  // 把原参数类型AssumedRole替换为SNSStackProps
  constructor(scope: cdk.Construct, id: string, props: SNSStackProps) {
    super(scope, id, props)

    const topicName = "TopicName"

    const topic = new sns.Topic(this, topicName, {
      displayName: "Topic Name",
      fifo: true,
      topicName: topicName,
      contentBasedDeduplication: true
    })

    const assumedRole = iam.Role.fromRoleArn(
      this,
      "AssumedRole",
      props.assumedRole
    )

    topic.grantPublish(assumedRole.grantPrincipal)
  }
}

2. 修正测试代码

  • 直接将SNSStack作为根栈实例化,不需要额外嵌套一层空Stack
  • 修正传入的参数名,和接口定义保持一致改为assumedRole
test("Creates an SNS topic ", () => {
  const app = new cdk.App()
  const stack = new SNSStack.SNSStack(app, "SNSStack", {
    env: {
      account: "test_account",
      region: "test_region"
    },
    // 参数名和接口匹配,改为assumedRole
    assumedRole: "arn:aws:iam::1111111:role/testRole"
  })
  expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot()
})

修改完成后重新执行测试,即可生成包含SNS主题、IAM权限等资源的完整快照。


内容的提问来源于stack exchange,提问作者DrkStr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 00:51:00