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

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属性时,断言触发失败。

两种断言写法的差异

  1. 常规「结果在前」写法:
b.Should().BeEquivalentTo(a); // 断言通过,因为A没有Prop3,不会校验B的该属性

这种写法下,断言会通过,无法检测到B的Prop3。

  1. 调换参数顺序的写法:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:05:21