FluentAssertions等价校验:忽略源端独有属性,目标端独有属性需报错
你当前使用的ExcludingMissingMembers配置仅会忽略预期对象(此处为X)有而实际对象(此处为Y)没有的成员,刚好符合你忽略X.D的需求,但FluentAssertions默认会自动跳过实际对象(Y)中找不到匹配源的属性,所以Y.A不会触发报错。
要实现目标端独有属性必须报错的规则,只需在配置中追加CheckAllMembersAreMatched()即可,同时需要显式配置X.AA到Y.A的映射关系——如果没有配置该映射,Y.A会因为找不到匹配的源属性直接触发报错,刚好符合你“属性未映射就报错”的要求。
完整可运行代码示例:
Y.Should().BeEquivalentTo(X, options => options // 配置X.AA到Y.A的属性映射,已提前配置过全局映射可删除该行 .WithMapping<X, Y>(src => src.AA, dest => dest.A) // 忽略源端独有的、目标端不存在的属性,适配X.D的校验规则 .ExcludingMissingMembers() // 强制要求目标端所有属性都必须匹配到源端属性,未匹配直接报错 .CheckAllMembersAreMatched() );
如果你使用的FluentAssertions版本低于6.0,不支持CheckAllMembersAreMatched方法,可以用手动校验属性列表的方式替代:
// 先校验Y的公共属性没有超出预期范围 typeof(Y).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) .Select(p => p.Name) .Should() .BeEquivalentTo(new[] { "A", "B", "C" }); // 再校验属性值等价性 Y.Should().BeEquivalentTo(X, options => options .WithMapping<X, Y>(src => src.AA, dest => dest.A) .ExcludingMissingMembers());
内容的提问来源于stack exchange,提问作者FBryant87
相关产品推荐
相关产品推荐

