2013-01-19 33 views
0

這是單元測試的第一次嘗試。我的.Equals方法在TestSet_Equals_TrueTestSet_Equals_True_Shuffled_Order上失敗。希望澄清這是否與單元測試有關,或者我的.Equals方法有問題。覆蓋等於方法和單元測試

單元測試:

private void Populate(Set set, int count) 
{ 
    for (int i = 0; i < count; ++i) 
     set.Add(i); 
} 

[TestMethod] 
public void TestSet_Equals_True() 
{ 
    Set set1 = new Set(); 
    Set set2 = new Set(); 

    Populate(set1, POPULATE_COUNT); 
    Populate(set2, POPULATE_COUNT); 
    bool expected = true; 
    bool actual = set1.Equals(set2); 
    Assert.AreEqual(expected, actual); 
} 

類:

List<object> _set; 

//Override Equals 
public override bool Equals(object obj) 
{ 
if (this.GetType() != obj.GetType()) 
    return false; 
Set o = (Set)obj; 

if (this._set.Count != o._set.Count) 
    return false; 

o._set.Sort(); 
this._set.Sort(); 

return _set.Equals(o._set); } 
+0

到底是什麼故障? –

+0

「TestSet_Equals_True」,「TestSet_Equals_True_Shuffled_Order」應該添加相同的元素並測試true,如果元素經過相等測試,如果元素失序但仍然是相同元素,則爲true。 – Kairan

+0

你是否也覆蓋'GetHashCode'?另外,看看這篇文章 - 它描述了一個數組比較的解決方案:http://www.dotnetperls.com/sequenceequal –

回答

3

List<T>實施的Equals的是object.Equals默認實現 - 參考平等。

要查看兩個IEnumerable<T>都是平等的,你可以使用擴展方法IEnumerable<T>.SequenceEquals - 不要忘記添加using語句System.Linq命名空間。

祝你好運。

0

您可以在Equals刪除Sort電話。我不知道他們服務的目的是什麼,他們不應該在Equals的實施中。名單Equals只是做參考平等。您可以使用SequenceEquals擴展方法IEnumerable<T>檢查這兒平等:

所有的
var a = new List<int> {1, 2}; 
var b = new List<int> {1, 2}; 

Assert.False(a.Equals(b)); 
Assert.True(a.SequenceEqual(b)); 
1

首先,不要你的設置相同方法內部排序。 Equals不應以任何方式更改您的對象。它只應確定2個對象是否相同。

您可以使用SequenceEquals但確實知道SequenceEquals不處理NullReferenceExceptions

所以我覺得這個問題是在你的Equals實現。也許你可以嘗試這樣的事:

public override bool Equals(object obj) 
    { 
     var isEqual = false; 

     var otherSet = obj as Set; 

     if (otherSet != null) 
     { 
      isEqual = _set.Count == otherSet.Count; 
      isEqual &= _set.SequenceEqual(otherSet); 
     } 

     return isEqual; 
    }