NUnit的Assert.Equals抛出exception“Assert.Equals不应该用于断言”

我最近尝试在编写新的NUnittesting时使用方法Assert.Equals()。 一旦执行,此​​方法将引发一个AssertionExceptionexception, AssertionException Assert.Equals should not be used for Assertions. 初看起来有点莫名其妙。 这里发生了什么?

Assert是从System.Objectinheritance的静态类,因为所有的类都隐含在c#中。 System.Object实现以下方法:

 static bool Equals(object a, object b) 

Assert中用于相等比较的方法是Assert.AreEqual()方法。 因此,在unit testing中通过Assert类调用Object.Equals()方法肯定是一个错误。 为了防止这种错误,避免混淆,NUnit的开发人员有意在Assert类中隐藏Object.Equals ,并引发exception。 这是实现:

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

当然,这个exception信息本身是令人困惑的,但至less它让你知道你做错了什么

tldr;

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

不:

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