FluentAssertions对象图比较时ExcludingMissingMembers无法排除多余属性怎么办
问题根因
你用错了FluentAssertions的排除配置项,两个语义相近的配置作用完全相反:
ExcludingMissingMembers():用于排除预期对象存在、实际对象不存在的成员,适合实际对象比预期少属性的场景ExcludingSurplusMembers():用于排除实际对象存在、预期对象不存在的成员,正好匹配你当前实体类比DTO多属性的场景
你当前的代码使用了前者,自然不会忽略实体类多出来的元数据属性,就算手动指定排除属性没生效,也大概率是版本兼容、属性继承导致的强类型匹配问题。
解决方案
方案1:修正配置项
直接把ExcludingMissingMembers换成ExcludingSurplusMembers即可:
result.Entity.Should().BeEquivalentTo(dto, opt => opt .ExcludingSurplusMembers() .Excluding(x => x.ValidationResult) .Excluding(x => x.CreatedBy) .Excluding(x => x.CreatedAt));
方案2:调整比较方向(更推荐)
如果你的校验目标只是「实体类的属性值和DTO完全匹配」,可以反过来写比较逻辑,把DTO作为实际校验对象、实体类作为预期值,这时候ExcludingMissingMembers就是正确的配置,不需要手动逐个指定要排除的元数据属性,后续给实体类新增元数据属性也不会导致现有测试失效:
dto.Should().BeEquivalentTo(result.Entity, opt => opt.ExcludingMissingMembers());
兜底方案
如果你用的FluentAssertions版本低于6.0,强类型Excluding扩展可能因为类型推断、继承属性等问题不生效,可以换成按成员名称匹配的排除写法:
result.Entity.Should().BeEquivalentTo(dto, opt => opt .ExcludingSurplusMembers() .Excluding(member => member.Name is nameof(Entity.ValidationResult) or nameof(Entity.CreatedBy) or nameof(Entity.CreatedAt)));
内容的提问来源于stack exchange,提问作者Rogerio Schmitt
相关产品推荐
相关产品推荐

