You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:36:06