Fluent Assertions Should().Should().BeEquivalentTo 忽略排除的成员

Posted

技术标签:

【中文标题】Fluent Assertions Should().Should().BeEquivalentTo 忽略排除的成员【英文标题】:Fluent Assertions Should().Should().BeEquivalentTo ignores excluded member 【发布时间】:2019-05-01 13:09:03 【问题描述】:

我在集成测试中创建两个相同类型的对象,但试图排除在创建对象时生成的自动增量成员。

我成功排除了 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”,但“46”与“6”不同 (索引 1)。

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

按值比较枚举 排除成员 root.RecordId 排除成员 root.Id 排除成员 root.Number 按名称匹配成员(或抛出) 没有自动转换。 严格控制字节数组中的项目顺序

我也尝试使用 WithTracing() 选项运行,但它没有提供有关相关属性的信息。

我已阅读文档,但没有找到任何表明排除抽象或虚拟属性是不可能的,我错了吗?

我在 5.5.0 和 5.5.3 版本上试过这个,结果相同。

编辑:

我已经检查并再次检查了该类或其继承的类都不等于。

【问题讨论】:

Job 是否覆盖 Equals 不,job 和其中的任何类都不是从 override Equals 继承的。这是定义 Id 和 Job 最终继承自的基类:我们在其上使用了 ElasticSearch 属性,这会不会弄乱它?公共抽象类 IndexObject [NoCaseKeywordString] 公共虚拟字符串 Id 获取; 其实IndexObject类的属性应该是抽象的而不是虚拟的。 你能发一个minimal reproducible example吗? 事实上,我建议将其发布到github.com/fluentassertions/fluentassertions/issues,以便我们进一步调查。 【参考方案1】:

我看到了,我的对象覆盖了 Equals(object obj),但我没想到 BeEquivalentTo 函数会受到影响。

我认为BeEquivalentTo 会改为通过对象图?

【讨论】:

以上是关于Fluent Assertions Should().Should().BeEquivalentTo 忽略排除的成员的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent Assertions 库的多个断言

Fluent Assertions - null 和空字符串比较 [关闭]

Fluent-ASsertions ShouldRaisePropertyChangeFor 不适用于异步任务?

如何使用 Fluent Assertions 引发异常?

Fluent Assertions ShouldBeEquivalentTo 总是以不同的属性传递

Fluent Assertions:大致比较两个 2D 矩形阵列