流利的断言: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()的主要内容,如果未能解决你的问题,请参考以下文章