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