如何测试cdk堆栈中的引用类型值?

Sti*_*ing 4 typescript aws-cdk

我正在使用 aws cdk 库来创建资源,并且能够成功创建资源。现在想要测试这个生成的statck。同样,如果它的单个资源能够很好地测试它,但是当堆栈有多个资源时,那么不知道如何休息。

以下是创建资源的代码。

constructor(scope: cdk.Construct, id: string, props: CIAMSQSProps = {} ) {
    super(scope, id);

    const queue = new sqs.Queue(this, id, {
      queueName: props.queueName!,
    });
    
    let ssmParamters = new CreateSSMParamaters(this, id, {
      envName: props.envName!,
      envValue: sqsQueue.queueUrl
    });
}
Run Code Online (Sandbox Code Playgroud)

以下是测试代码,但由于堆栈包含引用而失败。

test('Test SSM Parameter', () => {
  const app = new App();
  const sqsStack = new TestSQS(app, 'test-sqs-stack', {
    queueName: 'TestQueue',
    envName: 'TestQueue',
  });

  const template = Template.fromStack(sqsStack);
  template.hasResourceProperties(ResourceTypes.SSM_PARAM_TYPE, "{ Name: 'TestQueue', Value: 'TestQueue', Type: 'String' }");
});
Run Code Online (Sandbox Code Playgroud)

以下是错误。

Template has 1 resources with type AWS::SSM::Parameter, but none match as expected.
    The closest result is:
      {
        "Type": "AWS::SSM::Parameter",
        "Properties": {
          "Type": "String",
          "Value": {
            "Ref": "testsqsstackEDC1E09E"
          },
          "Name": "TestQueue"
        }
      }
    with the following mismatches:
        Expected type string but received object at /Properties (using objectLike matcher)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?或者有什么方法可以测试资源类型的特定属性?

fed*_*nev 6

我找到了几个测试属性引用的选项。我还没有看到关于这个主题的任何记录的最佳实践。也许这是因为,在大多数情况下,我们不需要测试这样的实现细节。

Construct选项1 从其Stack. 解析Token值。

template.hasResourceProperties('AWS::SSM::Parameter', {
  Value: stack.resolve(stack.queue.queueName),
});
Run Code Online (Sandbox Code Playgroud)

选项 2: 如上所述,但使用逃生舱口而不是字段导出来获取队列引用。

const childQueue = stack.node.tryFindChild('MyQueue') as sqs.Queue;

template.hasResourceProperties('AWS::SSM::Parameter', {
  Value: stack.resolve(childQueue.queueName),
});
Run Code Online (Sandbox Code Playgroud)

选项 3: 在模板中查找队列资源的名称。

const queues = template.findResources('AWS::SQS::Queue');
expect(Object.keys(queues)).toHaveLength(1);
const resolvedQueueName = Object.keys(queues)[0];

template.hasResourceProperties('AWS::SSM::Parameter', {
  Value: { 'Fn::GetAtt': [resolvedQueueName, 'QueueName'],},
});
Run Code Online (Sandbox Code Playgroud)