流畅的断言:Be() 与 Equals()

Rém*_*ren 3 c# unit-testing fluent-assertions

有什么区别:

  • subject.Should().Be(expected)
  • subject.Should().Equals(expected)

我总是使用Be(),但我现在有一个测试用例,其中Be()给出了不同的结果,然后Equals()。我的测试用例涉及一个结构并将其与该结构的默认值进行比较。

MyStruct subject = new MyStruct("value");

Assert.Equal(default, subject);                  // xUnit Assert => works
Assert.Equal(default(MyStruct), (object)subject); // xUnit Assert => works
subject.Should().Equals(default);                // works
subject.Should().Be(default(MyStruct));          // FAILS!
Run Code Online (Sandbox Code Playgroud)

Be()Equal()相同的,这是 Fluent Assertions 中的错误吗?或者他们主张不同的事情?

小智 5

方法Equals来自System.Object.
实际上,您将 Type 的对象ObjectAssertions与 object( ) 的默认值进行比较null

这不是一个断言。
该方法返回一个 false 的布尔值。

在此输入图像描述

  • 不,你不应该。`subject.Should().Equals(default);` 表示您在 FluentAssertions 对象上调用 .NET `Equals` 方法。这将返回一个“布尔值”。令我惊讶的是,您的 IDE 并未将其报告为潜在警告。`Should().Be()` 将使用结构体的 `Equals` 实现。由于您将一个空结构与另一个空结构进行比较,因此预计会失败。 (2认同)