在CDK测试中,toHaveResource和toHaveResourceLike有什么区别?

问题描述

CDK fine-grained construct tests中,两者之间有什么区别

expect(...).toHaveResource(...)

expect(...).toHaveResourceLike(...)

来自@aws-cdk/assert/jest模块?

解决方法

根据代码herehere,唯一的区别是toHaveResource要求传递的键值必须完全匹配,而在toHaveResourceLike中,实际值可以是参考值的超集。换句话说,如果您要声明某个属性的值,该属性本身就是一个对象,并且只想声明该对象的子集,则应使用toHaveResourceLike

例如,假设您要断言S3存储桶资源具有PublicAccessBlockConfiguration属性,且BlockPublicPolicy设置为true。

您可能会这样写:

test("has public access restricted",() => {
  expect(stack).toHaveResource("AWS::S3::Bucket",{
    PublicAccessBlockConfiguration: {
      BlockPublicPolicy: true,},});
});

但是这将失败,因为PublicAccessBlockConfiguration还具有其他子属性,例如BlockPublicAcls。但是,如果您将此处的toHaveResource切换为toHaveResourceLike,它将成功。