【问题标题】:NUnit's Assert.Equals throws exception "Assert.Equals should not be used for assertions"NUnit 的 Assert.Equals 抛出异常“Assert.Equals 不应用于断言”
【发布时间】:2012-07-20 17:46:43
【问题描述】:

我最近在编写新的 NUnit 测试时尝试使用 Assert.Equals() 方法。执行时,此方法会引发 AssertionException 声明 Assert.Equals should not be used for Assertions. 这乍一看有点莫名其妙。这是怎么回事?

【问题讨论】:

  • 您能否给我们一些上下文,例如它所在的特定代码?您比较的是什么类型的对象等?
  • 对不起,我已经找到了这个问题的答案。我只是问了它,所以我可以为后代发布答案。正如您通过阅读答案所看到的那样,上下文并不重要。我希望通过网络搜索异常消息很容易找到这个答案。

标签: .net nunit


【解决方案1】:

Assert 是从 System.Object 继承的静态类,正如所有类在 C# 中隐式执行的那样。 System.Object 实现了以下方法:

static bool Equals(object a, object b)

用于相等比较的 Assert 方法是 Assert.AreEqual() 方法。因此,在单元测试中通过 Assert 类调用Object.Equals() 方法肯定是错误的。为了防止这个错误并避免混淆,NUnit 的开发者故意将Object.Equals 隐藏在 Assert 类中,并带有一个抛出异常的实现。这是实现:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

当然,异常消息本身令人困惑,但至少它让你知道你做错了某事

【讨论】:

  • 该消息令人困惑,但将其输入谷歌,您最终会得到这个答案,一切都很好。谢谢 Odrade。
  • NUnit 的开发人员可以将消息更改为“...使用 Assert.AreEqual()”。
  • 为什么他们没有将 Equals 方法设为私有?
  • @shytikov 因为那是不可能的。您不能使用私有方法覆盖基类中的虚拟方法。
  • 感谢您的信息,为什么 NUnit 开发人员没有将 Equals 呼叫路由到 AreEqual 而不是显示这个令人困惑的消息..
【解决方案2】:

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

不是:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 2011-08-06
    • 2013-03-16
    • 1970-01-01
    • 2012-08-15
    • 2012-04-28
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多