2012-07-20 76 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