首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS-CDK如何使用细粒度断言测试属性

AWS-CDK如何使用细粒度断言测试属性
EN

Stack Overflow用户
提问于 2021-04-23 18:56:01
回答 1查看 359关注 0票数 0

如何测试传递给s3.Bucket的所有prop?我想测试传递给s3.Bucket的所有属性(无快照)。测试给我一个关于WebsiteConfiguration的错误...为了检查如何在toHaveResource fn中编写prop obj,我使用了this doc

有人能帮我吗?

代码语言:javascript
复制
import * as cdk from "@aws-cdk/core";
import * as s3 from "@aws-cdk/aws-s3";

export class S3CdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, "ReactGitHubActionBucket", {
      versioned: true,
      publicReadAccess: true,
      websiteIndexDocument: "index.html",
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });
  }
}
代码语言:javascript
复制
import { expect as expectCDK, haveResource } from '@aws-cdk/assert';
import * as cdk from '@aws-cdk/core';
import * as Stacks from '../lib/s3-cdk-stack';

test('First test', () => {
    const app = new cdk.App();

    const stack = new Stacks.S3CdkStack(app, 'S3CdkTestStack');

    expectCDK(stack).to(haveResource("AWS::S3::Bucket",{
      VersioningConfiguration: {
        Status: "Enabled"
      },
      WebsiteConfiguration: {
        IndexDocument: "index.html"
      }
    }))
});
代码语言:javascript
复制
$ jest
 FAIL  test/stacks.test.ts
  ✕ First test (68 ms)

  ● First test

    None of 1 resources matches resource 'AWS::S3::Bucket' with {
      "$objectLike": {
        "VersioningConfiguration": {
          "Status": "Enabled"
        },
        "WebsiteConfiguration": {
          "IndexDocument": "index.html"
        }
      }
    }.
    - Field WebsiteConfiguration missing in:
        {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "VersioningConfiguration": {
              "Status": "Enabled"
            }
          },
          "UpdateReplacePolicy": "Retain",
          "DeletionPolicy": "Retain"
        }
EN

回答 1

Stack Overflow用户

发布于 2021-07-13 12:39:46

在您写完问题后,它可能已经更新了,但是从CDK 1.113.0开始,下面的示例对我来说是有效的。

请注意,我的导入与您的导入略有不同,并且我使用的是.toHaveResource()而不是.to(haveResource())

代码语言:javascript
复制
// CDK version: 1.113.0
import '@aws-cdk/assert/jest';
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

// Included for completeness, but you'd import this:
class S3CdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, 'ReactGitHubActionBucket', {
      versioned: true,
      publicReadAccess: true,
      websiteIndexDocument: 'index.html',
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });
  }
}

// This test should pass:
test('Test complete S3 bucket configuration', () => {
  const app = new cdk.App();
  const stack = new S3CdkStack(app, 'S3CdkTestStack');

  //            ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
  expect(stack).toHaveResource('AWS::S3::Bucket', {
    VersioningConfiguration: {
      Status: 'Enabled',
    },
    WebsiteConfiguration: {
      IndexDocument: 'index.html',
    },
  });
});

额外提示:.toHaveResourceLike()

当您正在检查的资源属性值很简单时,.toHaveResource()工作得很好。

例如,您通过上面的S3CdkStack()类创建的CloudFormation模板包含一个具有以下Description属性的Lambda函数:

代码语言:javascript
复制
{
  "Resources": {
    "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Description": {
          "Fn::Join": [
            "",
            [
              "Lambda function for auto-deleting objects in ",
              {
                "Ref": "ReactGitHubActionBucket1CE57800"
              },
              " S3 bucket."
            ]
          ]
        }
      }
    }
  }
}

使用.toHaveResource()测试该描述中“自动删除”的存在(就像一个说明性示例)将需要包括整个描述对象,该对象是脆弱的,并且包含看起来像散列的东西……

在这种情况下,最好使用.toHaveResourceLike()并只检查您感兴趣的对象部分:

代码语言:javascript
复制
test('Test a subset of the Lambda description', () => {
  const app = new cdk.App();
  const stack = new S3CdkStack(app, 'S3CdkTestStack');

  //                          ↓↓↓↓
  expect(stack).toHaveResourceLike('AWS::Lambda::Function', {
    // Only need to include the subset of
    // the value object you're testing:
    Description: {
      'Fn::Join': [
        '',
        ['Lambda function for auto-deleting objects in '],
      ],
    },
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67228714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档