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

因此,实现这项工作的唯一方法是添加publicinternal 属性,或者正确实现Equals

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review 改写了我的解决方案。

以上是关于Fluent Assertions Should().BeEquivalentTo 只有私有字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent Assertions 库的多个断言

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

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

如何使用 Fluent Assertions 引发异常?

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

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