C# 流畅的断言应该()与只有私有字段的断言相等

C# 流畅的断言应该()与只有私有字段的断言相等,c#,unit-testing,testing,tdd,fluent-assertions,C#,Unit Testing,Testing,Tdd,Fluent Assertions,尝试将对象与单个专用字段进行比较 像这样的对象: 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().BeEqui

尝试将对象与单个专用字段进行比较

像这样的对象:

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

的情况下,我得到了一个肯定的比较,因为你在比较结构,而结构是由FA作为一种具有值语义的类型,FA将使用编译器生成的
Equals
实现。在本例中,结构包含
字节[]
数组的两个不同实例,因此它们永远不会匹配。此外,FA永远不会报告或访问私有字段的值。如果你决定它是私人的,为什么会这样?而且您没有以任何合适的方式覆盖
ToString


因此,实现此功能的唯一方法是添加
public
internal
属性,或者正确实现
Equals

您不应该对私有成员进行断言。当
字节不同时,应该有一个公开行为变化的公共成员。请看@Stijn,似乎我有一个不明确的大小写,object
A
是唯一的id,它是我代码中其他对象的字段。听起来很奇怪,但在所有情况下,我不会将唯一id与其他唯一id进行比较(将其像字节数组一样存储在数据库中,通过
MyUniqueId.GetByteArray()
获取字节数组)。看起来我只会在测试中重载
Equals
,所以
A
有一个方法
GetByteArray()
?如果是这样的话,你应该为该方法编写一个单元测试,而不是实现
Equals()
。是的,
a
有一个方法
GetByteArray()
,但是在我的测试中,我比较了包含
a
类B{public a Id{get;}…}
的对象,这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-重新表述了我的解决方案。