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