2013-07-08 42 views
2

當我運行一些TestMethods這就是測試失敗測試一個JSON串行器的實現和前後系列化\反序列化比較兩個IList的對象時,但比較失敗。單位比較兩個ILists

型號

public class BusinessModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

測試

IList<BusinessModel> model = new List<BusinessModel> 
{ 
    new BusinessModel { ID = 1, Name = "Test1" }, 
    new BusinessModel { ID = 2, Name = "Test2" }, 
    new BusinessModel { ID = 3, Name = "Test3" }, 
    new BusinessModel { ID = 4, Name = "Test4" } 
}; 

[TestMethod] 
public async Task TestSerialiseDeserialiseIsEqual() 
{ 
    ISerialiser serialiser = new Serialiser(); 

    IList<BusinessModel> deserialisedModel; 
    string serialised = string.Empty; 

    serialised = await serialiser.SerialiseAsync<IList<BusinessModel>>(model); 
    deserialisedModel = await serialiser.DeserialiseAsync<IList<BusinessModel>>(serialised); 

    Assert.IsTrue(model.SequenceEqual(deserialisedModel)); 
} 

結果

我已經嘗試了一些測試方法的細節在this後,但都失敗了。

Assert.AreEqual(t1.Count(), t2.Count()); 

IEnumerator<Token> e1 = t1.GetEnumerator(); 
IEnumerator<Token> e2 = t2.GetEnumerator(); 

while (e1.MoveNext() && e2.MoveNext()) 
{ 
    Assert.AreEqual(e1.Current, e2.Current); 
} 

傳遞集合計數項目,但在第一個對象比較失敗。

Assert.IsTrue(model.SequenceEqual(deserialisedModel)); 

失敗Assert.IsTrue failed

CollectionAssert.AreEqual(model.ToArray(),deserialisedModel.ToArray()) 

失敗Collection.AreEqual failed (Element at index 0 do not match)

CollectionAssert.AreEquivalent(model.ToArray(),deserialisedModel.ToArray()) 

失敗{"CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s) of <Helper.Tests.Serialisation.BusinessModel>. The actual collection contains 0 occurrence(s). "}

從檢查的對象,他們看起來是一樣的

原始

enter image description here

Deserialised對象

enter image description here

問題

什麼是比較對於聯合國的IList對象的最佳方法它測試?爲什麼我的測試失敗?

回答

4

您需要爲您的BusinessModel類定義EqualsGetHashCode。默認Equals實現是參考平等,你的對象引用將會在兩個列表中的項目不同。

或者,也可以創建一個IEqualityComparer<BusinessModel>,其限定平等/散列碼並將其傳遞到SequenceEquals

+0

謝謝李。重寫Equals和GetHashCode方法對問題進行排序 –