【问题标题】:Fluent Assertions: Be() vs Equals()流利的断言: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 中的错误吗?还是他们在主张不同的东西?

【问题讨论】:

标签: c# unit-testing fluent-assertions


【解决方案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
猜你喜欢
  • 2020-02-08
  • 2014-07-27
  • 2018-06-25
  • 2018-12-01
  • 2021-01-18
  • 2016-04-11
  • 2015-09-23
  • 2021-01-08
  • 2022-07-23
相关资源
最近更新 更多