NUnit的Assert.Equals抛出异常"Assert.Equals不应该用于断言"

Odr*_*ade 127 .net nunit

我最近尝试在编写新的NUnit测试时使用Assert.Equals()方法.在执行时,这种方法抛出一个AssertionException说明, Assert.Equals should not be used for Assertions. 乍一看这有点莫名其妙.这里发生了什么?

Odr*_*ade 193

Assert是一个继承自System.Object的静态类,因为所有类都在c#中隐式执行.System.Object实现以下方法:

static bool Equals(object a, object b)
Run Code Online (Sandbox Code Playgroud)

用于等式比较的Assert Assert.AreEqual()方法是方法.因此,Object.Equals()在单元测试中通过Assert类调用该方法肯定是一个错误.为了防止这种错误并避免混淆,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");
 }
Run Code Online (Sandbox Code Playgroud)

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

  • NUnit的开发人员可以将消息更改为"...使用Assert.AreEqual()". (24认同)
  • 该消息令人困惑,但将其输入谷歌,你最终会在这里得到答案,一切都很顺利.谢谢Odrade. (12认同)
  • @shytikov因为那是不可能的.您不能使用私有方法覆盖基类中的虚方法. (4认同)

Dou*_*oug 13

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b
Run Code Online (Sandbox Code Playgroud)

不:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Run Code Online (Sandbox Code Playgroud)