Fluent Assertions Should().BeEquivalentTo 只有私有字段
Posted
技术标签:
【中文标题】Fluent Assertions Should().BeEquivalentTo 只有私有字段【英文标题】:Fluent Assertions Should().BeEquivalentTo with only private field 【发布时间】:2019-09-30 02:50:11 【问题描述】:尝试比较具有单个私有字段的对象
像这样的对象:
public struct A
private readonly byte[] bytes;
public A(byte[] bytes)
this.bytes = bytes;
这样比较:
var a = new A(new byte[] 1, 2, 3 );
var b = new A(new byte[] 1, 2, 3 );
a.Should().BeEquivalentTo(b);
结果:
Message: Expected a to be
A
, but found
A
.
我得到一个肯定的比较,没有覆盖Equals
?
【问题讨论】:
你不应该断言私人成员。当bytes
不同时,应该有一个公共成员公开行为变化。见***.com/a/34586/247702
@Stijn ,似乎我有一个模棱两可的情况,对象A
是唯一ID,它是我代码中其他对象的字段。听起来很奇怪,但在所有情况下,我不会将唯一 ID 与其他唯一 ID 进行比较(将其存储在数据库中,如字节数组,通过 MyUniqueId.GetByteArray()
获取字节数组)。所以看起来我将重载Equals
仅用于测试,
所以A
有一个方法GetByteArray()
?如果是这样,您应该为该方法编写一个单元测试,而不是实现 Equals()
我认为。
是的,A
有一个方法GetByteArray()
,但是在我的测试中我比较了包含A
的对象:class B public A Id get; ...
【参考方案1】:
由于您正在比较结构,FA 将 treated 视为具有值语义的类型,因此 FA 将使用编译器生成的 Equals
实现。在这种情况下,您的结构包含 byte[]
数组的两个不同实例,因此它们永远不会匹配。此外,FA 永远不会报告或访问私有字段的值。如果您决定将其保密,为什么要这样做?而且您没有以任何合适的方式覆盖ToString
。
因此,实现这项工作的唯一方法是添加public
或internal
属性,或者正确实现Equals
。
【讨论】:
这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review 改写了我的解决方案。以上是关于Fluent Assertions Should().BeEquivalentTo 只有私有字段的主要内容,如果未能解决你的问题,请参考以下文章
Fluent Assertions - null 和空字符串比较 [关闭]
Fluent-ASsertions ShouldRaisePropertyChangeFor 不适用于异步任务?