139

我最近尝试在编写新的 NUnit 测试时使用 Assert.Equals() 方法。执行时,此方法会抛出一个AssertionException声明, Assert.Equals should not be used for Assertions. 乍一看这有点令人困惑。这里发生了什么?

4

2 回答 2

217

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");
 }

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

于 2012-07-20T17:52:28.297 回答
20

tldr;

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

不是:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
于 2017-09-21T05:42:19.600 回答