FluentAssertions如何比对属性名称不同的对象的等价性?
FluentAssertions异名属性等价比对实现方案
单个零散异名属性匹配
针对单独的属性名差异场景,直接使用内置的WithMapping方法配置映射关系即可,示例如下:
// 替换YType、XType为对应对象的实际类型 x.Should().BeEquivalentTo(y, options => options .WithMapping<YType, XType>( y => y.PropertyWithName, x => x.PropertyWithVerySimilarName ));
如果需要配置多组异名属性匹配,链式调用WithMapping方法即可。
批量统一规则的异名属性匹配
如果两类对象的属性命名存在统一的规则差异(例如前缀、后缀、大小写差异),可以通过WithNameMatching配置全局名称匹配逻辑,不用逐个配置映射:
x.Should().BeEquivalentTo(y, options => options .WithNameMatching((actualMemberName, expectedMemberName) => { // 此处示例逻辑为忽略大小写、去掉名称中的Dto后缀后匹配,可按需修改 var processedExpectedName = expectedMemberName.Replace("Dto", string.Empty); return actualMemberName.Equals(processedExpectedName, StringComparison.OrdinalIgnoreCase); }));
补充说明
- 单属性映射的
WithMapping规则优先级高于全局的WithNameMatching规则,冲突时优先触发前者 - 配置规则后其余未手动指定的属性仍会按照FluentAssertions默认的等价比对规则执行
内容的提问来源于stack exchange,提问作者FBryant87
相关产品推荐
相关产品推荐

