學習如何使用NUnit編寫單元測試。如何使用NUnit單元測試比較複雜對象
努力比較兩個複雜的對象。
有一個答案,一個非常類似的問題在這裏Comparing Two objects using Assert.AreEqual()雖然它看起來像你預期凌駕於你的對象Equals()
- 這是不理想給了我多少的對象有可能是,你想比較,更不用說對象及其嵌套對象上可能存在的屬性的數量。
給出的樣本對象:
public class AMockObject
{
public int Id { get; set; }
public ICollection<int> Numbers { get; set; }
public AMockObject()
{
Numbers = new List<int>();
}
}
我想比較,這個對象的兩個單獨的實例具有相同的價值觀和我發現Assert.AreEqual()
是不是真的做什麼我的預期。
例如,所有的這些失敗:
// Example 1
AMockObject a = new AMockObject();
AMockObject b = new AMockObject();
Assert.AreEqual(a,b); // Fails - they're not equal
// Example 2
AMockObject a = new AMockObject() { Id = 1 };
AMockObject b = new AMockObject() { Id = 1 };
Assert.AreEqual(a, b); // Also fails
// Example 3
AMockObject a = new AMockObject() { Id = 1 };
a.Numbers.Add(1);
a.Numbers.Add(2);
a.Numbers.Add(3);
AMockObject b = new AMockObject() { Id = 1 };
b.Numbers.Add(1);
b.Numbers.Add(2);
b.Numbers.Add(3);
Assert.AreEqual(a, b); // also fails
我們已制訂了代碼中我們克隆的各種對象,其中一些非常大的。 鑑於這是一件很常見的事情,有兩種測試方法可以測試兩個對象在屬性值級別是否相同?
這裏的例子有兩個屬性。在現實世界中,我有一個有幾十個屬性的對象,其中一些屬性是其他複雜對象的列表。
目前,我序列化對象和比較字符串,雖然這感覺不太理想。
我認爲你的序列化方法可能不是那麼糟糕。否則,你會考慮重寫平等的東西,或者寫一些深刻的複雜的反思。 – Derek
您需要考慮的名單,是1,2,3是否與3,1,2相同?訂貨是否重要?Xml比較可能最終會有所不同。 – Derek
@Derek - 例如,訂單可能無關緊要。雖然只是做一個真正的比較而已。在我的現實世界中,情況並非如此,但這並不是說它不會。 – Darren