在 AWS CDK 中,我可以编写 Jest 单元测试来测试资源是否具有特定属性。但是如何测试不是属性的资源 DeletionPolicy 值?
cdk.out/example.template.json(简化)
"AppsUserPool8FD9D0C0": {
"Type": "AWS::Cognito::UserPool",
"Properties": {
"UserPoolName": "test",
...
},
"UpdateReplacePolicy": "Retain",
"DeletionPolicy": "Retain",
"Metadata": {}
}
Jest 属性单元测试通过(简化)
expect(stack).toHaveResourceLike('AWS::Cognito::UserPool', {
"UserPoolName": "test"
});
Jest 单元测试因 DeletionPolicy 失败(简化)
expect(stack).toHaveResourceLike('AWS::Cognito::UserPool', {
"DeletionPolicy": "Retain"
});
更新了 CDK 2.x 的代码片段
const template = Template.fromStack(stack);
template.hasResource('AWS::Cognito::UserPool', {
DeletionPolicy: 'Retain',
UpdateReplacePolicy: 'Retain',
});
您可以使用带有参数的haveResouce()
ResourcePart.CompleteDefinition
示例片段
expect(stack).to(haveResource('AWS::CloudFormation::CustomResource', {
DeletionPolicy: 'Retain',
UpdateReplacePolicy: 'Retain',
}, ResourcePart.CompleteDefinition));
这是确认在 CDK 版本上工作的更新代码片段:1.107.0
import { ResourcePart } from '@aws-cdk/assert';
test('stack has correct policies', async () => {
expect(stack).toHaveResource('AWS::Cognito::UserPool', {
DeletionPolicy: 'Retain',
UpdateReplacePolicy: 'Retain',
}, ResourcePart.CompleteDefinition);
});
如果仔细观察生成的 CloudFormation 模板,每个资源都有一个
Properties
对象。例如,在此 S3 资源中:
"Resources": {
"BucketName2A2AF266": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "bucket-name",
"Tags": [
{
"Key": "aws-cdk:auto-delete-objects",
"Value": "true"
}
]
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete",
"Metadata": {
"aws:cdk:path": "Stack/Bucket/Resource"
}
}
}
要测试
BucketName
(或其他 Properties
值),请使用 hasResourceProperties
方法。
但是,如果您想测试
DeletionPolicy
或 UpdateReplacePolicy
(位于 Properties
之外)等属性,请改用 hasResource
方法。
hasResourceProperties
:仅测试 Properties
对象。hasResource
:测试完整的资源定义。我使用的是CDK 2.172.0版本。