2012-07-20 78 views
110

我最近尝试在编写新的NUnit测试时使用方法Assert.Equals()。一旦执行此方法将抛出AssertionException,说明 Assert.Equals should not be used for Assertions.乍一看这有点令人费解。这里发生了什么?NUnit的Assert.Equals抛出异常“Assert.Equals不应该用于断言”

+0

你能不能给我们一些环境中,例如特定的代码,这是在?你比较什么类型的对象等? – 2012-07-20 17:50:59

+9

对不起,但我已经找到了答案。我只是问了它,所以我可以为后代发表答案。上下文并不重要,你会通过阅读答案来看到。我希望这个答案很容易通过网络搜索发现异常信息。 – Odrade 2012-07-20 17:55:59

+2

+1为诚实! – stannius 2012-11-01 22:38:31

回答

164

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

static bool Equals(object a, object b) 

其意图是否相等的比较上断言的方法是本Assert.AreEqual()方法。因此,在单元测试中通过Assert类调用Object.Equals()方法肯定是一个错误。为了防止这种错误并避免混淆,NUnit的开发人员有意将Assert类中的Object.Equals隐藏在引发异常的实现中。下面是执行:

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

当然除了消息本身是混乱的,但至少它可以让你知道你做了什么错误

+1

节省了我几个小时的头痛。 – fregas 2013-02-18 22:44:36

+12

该消息令人困惑,但将其输入到Google,您最终会在此处回答此问题,并且一切正常。感谢Odrade。 – 2013-04-04 15:08:19

+18

NUnit的开发人员可以将消息更改为“...使用Assert.AreEqual()”。 – WillC 2015-06-05 17:29:05

3

tldr;

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

不是:

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