【问题标题】:Fluent Assertions Should().BeEquivalentTo with only private fieldFluent Assertions Should().BeEquivalentTo 只有私有字段
【发布时间】: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 不同时,应该有一个公共成员公开行为变化。见stackoverflow.com/a/34586/247702
  • @Stijn ,似乎我有一个模棱两可的情况,对象A 是唯一ID,它是我代码中其他对象的字段。听起来很奇怪,但在所有情况下,我不会将唯一 ID 与其他唯一 ID 进行比较(将其存储在数据库中,如字节数组,通过 MyUniqueId.GetByteArray() 获取字节数组)。所以看起来我将重载Equals 仅用于测试,
  • 所以A 有一个方法GetByteArray()?如果是这样,您应该为该方法编写一个单元测试,而不是实现 Equals() 我认为。
  • 是的,A 有一个方法GetByteArray(),但是在我的测试中我比较了包含A 的对象:class B { public A Id {get;} ... }

标签: c# unit-testing testing tdd fluent-assertions


【解决方案1】:

由于您正在比较结构,FA 将 treated 视为具有值语义的类型,因此 FA 将使用编译器生成的 Equals 实现。在这种情况下,您的结构包含 byte[] 数组的两个不同实例,因此它们永远不会匹配。此外,FA 永远不会报告或访问私有字段的值。如果您决定将其保密,为什么要这样做?而且您没有以任何合适的方式覆盖ToString

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

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 改写了我的解决方案。
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 2014-11-13
  • 2013-04-15
  • 2020-07-04
  • 1970-01-01
  • 2022-12-01
  • 2020-06-09
  • 2018-07-23
相关资源
最近更新 更多