流畅断言的Should().Should().BeEquivalentTo忽略了被排除的成员。

4

我正在创建两个相同类型的对象进行集成测试,但尝试排除在对象创建时生成的自动递增成员。

我成功地排除了RecordId和Number属性,但等价性测试在Id属性上失败。RecordId和number属性是从抽象类继承的,但Id不同,因为它是从抽象类继承的抽象属性,然后被覆盖。

Id属性是一个抽象字符串属性,只读。

//CreateJob creates indentical jobs, but with autoincremented id, number and recordid   
Job job1 = CreateJob();
Job job2 = CreateJob();

job1.Should().BeEquivalentTo(job2, config => config
   .Excluding(o => o.RecordId)
   .Excluding(o => o.Id)
   .Excluding(o => o.Number)
);

错误信息:预期成员Id为"45",但与"6"不同 (索引1)。

使用的配置如下: - 使用声明类型和成员

  • 按值比较枚举
  • 排除根记录号成员
  • 排除根Id成员
  • 排除根编号成员
  • 通过名称匹配成员(或抛出异常)
  • 不进行自动转换。
  • 对字节数组中的项目顺序要求严格

我还尝试使用WithTracing()选项运行,但它没有提供有关有问题的属性的任何信息。

我已经阅读了文档,未发现任何表明无法排除抽象或虚属性的内容,我错了吗?

我已在版本5.5.0和5.5.3上尝试过,结果完全相同。

编辑:

我已经检查过两次,该类及其继承的类都没有覆盖equals方法。


Job 是否覆盖了 Equals 方法? - Dennis Doomen
不,工作类及其任何子类都没有重写Equals方法。这是基类,定义了Id属性,而Job类最终从它继承: 我们在它上面使用了ElasticSearch属性,这可能会影响吗?public abstract class IndexObject { [NoCaseKeywordString] public virtual string Id { get; } } - Gnus
实际上,在IndexObject类中,该属性应该是抽象的而不是虚拟的。 - Gnus
你能否发布一个 [mcve] 吗? - user247702
事实上,我建议将此发布在 https://github.com/fluentassertions/fluentassertions/issues 上,以便我们进一步调查。 - Dennis Doomen
你找到解决方法了吗?我也有同样的问题,我的字段也叫“Id”。 - Lee D
1个回答

1
我看到了这个,我的对象已经重写了Equals(object obj),但我没有预料到BeEquivalentTo函数会受到影响。
我以为BeEquivalentTo会遍历对象图呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接