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
相关产品推荐
相关产品推荐

