FluentAssertions中BeEquivalentTo参数顺序及映射断言合理性咨询
FluentAssertions 类等价断言的参数顺序问题
先定义两个测试类:
public class A { public string Prop1 { get; set; } public string Prop2 { get; set; } } public class B { public string Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } }
需求场景
类映射完成后,希望通过FluentAssertions断言检测:结果类B存在源类A没有的Prop3属性时,断言触发失败。
两种断言写法的差异
- 常规「结果在前」写法:
b.Should().BeEquivalentTo(a); // 断言通过,因为A没有Prop3,不会校验B的该属性
这种写法下,断言会通过,无法检测到B的Prop3。
- 调换参数顺序的写法:
a.Should().BeEquivalentTo(b); // 断言失败,因为B有A没有的Prop3
这种写法能触发预期的失败。
问题解答
这是符合FluentAssertions设计逻辑的常规用法,并非非常规使用。
核心逻辑
BeEquivalentTo的默认校验规则是:以左侧对象为基准,校验右侧对象是否包含左侧的所有属性,且属性值匹配。
- 当
b在前时,基准是B的属性,但对比对象A没有Prop3,所以不会校验B的该属性是否存在/匹配; - 当
a在前时,基准是A的属性,对比对象B多了Prop3,不符合“右侧包含左侧所有属性”的校验逻辑,因此触发失败。
补充:保持「结果在前」的严格校验写法
如果想保持b在前的写法,同时检测多余属性,可以开启严格模式,强制校验两边属性完全一致:
b.Should().BeEquivalentTo(a, options => options.Strict() // 开启严格模式,校验属性完全匹配 );
这样即使b在前,只要B有A没有的属性,断言就会失败。
内容的提问来源于stack exchange,提问作者FBryant87
相关产品推荐
相关产品推荐

