typescript 如何使用cdktf在IamInstanceProfile中设置对角色进行单元测试

6kkfgxo0  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(81)

我正在编写cdktf(在typescript中)来单元测试组成一些基础设施的组件。我想知道如何测试IamInstanceProfile中的角色设置是否正确。由于它是自动生成的(使用synth),似乎没有内置的方法来检查。
将iamRole设置为iamInstanceProfile的代码

export class Roles extends Construct {
  iamRole: IamRole;
  iamInstanceProfile: IamInstanceProfile;

  constructor(scope: Construct, id: string) {
    super(scope, id);

    this.iamRole = new IamRole(this, "xxx", {
      assumeRolePolicy: this.getPolicy().json,
      managedPolicyArns: [
        "arn:aws:iam::aws:policy/xxx"
      ],
      name: "xxx"
    });

    this.iamInstanceProfile = new IamInstanceProfile(this, "yyy", {
      name: "test_profile",
      role: this.iamRole.name
    });
  }

单元测试

const stack = Testing.synth( new MyStack(new App(), "RunnerTest", baseConfig));
    expect(stack).toHaveResourceWithProperties(IamInstanceProfile, {
      name: 'test_profile',
      role: '<???HOW-TO-GET-THIS-VALUE???>'
    });

误差

Error: Expected aws_iam_instance_profile with properties {"name":"test_profile","role":"<???HOW-TO-GET-THIS-VALUE???>"} to be present in synthesized stack.
Found 1 aws_iam_instance_profile resources instead:
[
  {
    "name": "test_profile",
    "role": "<AUTO_GENERATED>"
  }
]

是否可以在不解析stack json输出的情况下找到角色的生成值?

qojgxg4l

qojgxg4l1#

.name是一个引用,将产生一个内容为${aws_iam_role.<ID>.name}的字符串。(以便这些ID可以保持全局唯一,同时在构造内部和外部具有相同的名称),因此无法猜测。要找到它,可以使用快照测试或控制台日志,但是为了能够适应变化,你需要构建一个函数来找到它,或者你可以使用.overrideLogicalId("new_id")函数来覆盖IAMRole的ID。如果你在类上公开角色,你甚至可以在测试用例中这样做。

相关问题