2013-07-25 106 views
0

我一直在NUnit遇到問題。我有一個從List繼承的類並覆蓋Equals()(因此,當兩個實例按照不同的順序包含相同的元素時,它們可以被視爲相等)。當使用Assert.AreEqual,它失敗了,但使用Assert.True和調用的Equals手工作品:Assert.AreEqual失敗的派生自List <>的類重寫Equals()

[Test] 
public void Equals() 
{ 
    var dieSet1 = new DieSet {new Die(1), new Die(2)}; 
    var dieSet2 = new DieSet {new Die(2), new Die(1)}; 

    Assert.True(dieSet1.Equals(dieSet2)); //ok 
    Assert.AreEqual(dieSet1, dieSet2); //fails with an exception 
} 

下面是異常詳細信息:

NUnit.Framework.AssertionException是由用戶代碼未處理 的HResult = -2146233088 消息=預期與實際都與2個元素 值不同索引[0] 預期: 但是:

源= nunit.fram ework 堆棧跟蹤: 在NUnit.Framework.Assert.That(對象實際,IResolveConstraint表達,字符串信息,對象[]參數) 在NUnit.Framework.Assert.AreEqual(預期的對象,對象的實際) 在DiceLibTest.DieSetTest。等於()在C:\ dev_code \ DiceLib \ DiceLibTest \ DieSetTest.cs:行47 的InnerException:

我的equals()設置一個斷點,並確保當Assert.AreEqual是它不叫調用。

我的班級是這樣的:

public class DieSet : List<Die>, IRollable 
{ 
} 

我讀過一些相關的問題,例如: NUnit doesn't work well with Assert.AreEqual

但我仔細檢查了我的equals()方法的簽名正確。

public override bool Equals(object obj) 
{ 
} 

我的猜測是NUnit的內部對列表<一些特殊行爲>和/或一般的陣列和/或集合,而我的課落入這些類別之一。我的另一個猜測是,我做錯了什麼,我沒有看到明顯的..

回答

5

是的 - 這是documented

與2.4版開始,多維的數組,嵌套數組(數組數組)和集合可以進行比較。如果兩個數組或集合具有相同的維度並且每個相應的元素相等,則它們將被Assert.AreEqual視爲相等。

所以你基本上可能需要Assert.True版本。

對於大多數用戶,此行爲可能是可取的 - 它只是恰好與您的特定用途相沖突。

就個人而言,我不會制定一個從List<T>派生的集合語義類型來開始 - 但如果你實現ISet<T>而不是(和使用的組合),那麼它可能會工作。

+0

哎喲,這是在手冊中,我一定錯過了... 感謝有關實施ISet和使用組合的建議。 – misterfrb

3

CollectionAssert.AreEqualCollectionAssert.AreEquivalent是稍微更透明的方式來測試兩個集合是否分別以相同的順序或任何順序包含相同的元素。如果我知道我在比較收藏,我傾向於嘗試並使用它們。

+0

感謝您的提示,不知道這些方法! 我選擇Jon Skeet的答案作爲最佳答案,因爲我認爲它最好地回答了我的問題,但是您的建議實際上非常有幫助,現在我得到了Equals()方法的免費平凡實現。我仍然在猶豫是否應該真的重寫平等,現在我真的在想,也許我應該在需要時使用CollectionAssert.AreEquivalent – misterfrb

相關問題