流利的断言:Be() vs Equals()

Posted

技术标签:

【中文标题】流利的断言:Be() vs Equals()【英文标题】:Fluent Assertions: Be() vs Equals() 【发布时间】:2020-08-16 18:13:04 【问题描述】:

有什么区别:

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!

Be()Equal() 是否相同,这是 Fluent Assertions 中的错误吗?还是他们在主张不同的东西?

【问题讨论】:

我无法重现您的结果。你的结构是如何定义的,尤其是关于它的默认值? @SotirisKoukios-Panopoulos 它不是默认结构。获得一个好的默认值有一些技巧。见github.com/DynamicHands/NodaMoney/blob/feature/… 【参考方案1】:

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

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

【讨论】:

啊哈,我太傻了。如此明显。但是 Be() 似乎给出了错误的答案,我需要深入研究 Fluent Assertions 代码并可能报告问题。 不,你不应该。 subject.Should().Equals(default); 表示您在 FluentAssertions 对象上调用 .NET Equals 方法。这将返回一个bool。令我惊讶的是,您的 IDE 并未将其报告为潜在警告。 Should().Be() 将使用结构的 Equals 实现。而且由于您将一个空结构与另一个结构进行比较,因此预计会失败。 问题似乎在于为什么 Assert.Equal 首先成功了。我也认为Should().Be() 调用是正确的。 问题出在我自己的代码上。我通过将结构(this)的引用交换到另一个内存位置来使用一些技巧。当您在初始化默认结构并同时检查相等性时这样做时,字段仍然为空,但属性(包装这些字段)确实具有值:S。所以variable1 == default 失败,但首先将变量初始化为默认值并将其与 variable1 进行比较:MyStruct variable2 = default; variable1 == variable2

以上是关于流利的断言:Be() vs Equals()的主要内容,如果未能解决你的问题,请参考以下文章

为啥流利的断言失败但断言通过了枚举?

流利的断言;结合集合和对象图比较断言

如何使用流利的断言结合集合和属性断言?

OR 条件的流利断言

如何使用流利断言断言集合中的所有项目?

流利的断言 - 元组