2010-02-01 83 views
2

給定兩個字典NUnit的:檢查是否兩個字典是相同的

var dictA = new Dictionary<string, classA>(); 
var dictB = new Dictionary<string, classA>(); 

如何檢查這兩個字典是否是相同的API? 這裏的漁獲是我不能使用默認的classA.Equals來比較值對。相反,只有在字典中classA類型的所有對象都必須滿足我自己的自定義IEqualityComparer<ClassA>時,測試纔會通過。

具體來說,我從IEqualityComparer<ClassA>,或同等看着像

CollectionAssert.AreEquivalent(dictA, dictB, new ClassEqualityComparer()); 

ClassEqualityComparer繼承。我不介意,如果我要繼承一個NUnit的類型IEqualityComparer(如IResolveConstraint),但最重要的一點是,Assert方法必須是這樣的

Assertion(dictA, dictB, EqualityComparer) 

或者一些更簡單;我不想使用Assert.That,然後實現一種類型爲IResolveConstraint的頁面,以檢查兩個字典是否相同。

有什麼想法?

回答

0

如果您可以控制單元測試中這些字典的實例,您可以將comparer傳遞給合適的constructor

+0

'比較器'只比較字典的鍵值,它不會比較值。 – Graviton 2010-02-01 07:58:41

+0

如果你想比較值,一個列表比哈希表更合適的數據類型。 – 2010-02-01 08:23:08

+0

我不能因爲列表比較意味着我必須得到正確的項目順序。在我的比較中,訂單並不重要。 – Graviton 2010-02-01 08:46:06

2

所以我想你需要測試辭典「B」包含所有相同的密鑰爲「A」,反之亦然,然後用你的比較器來比較每個值:

Assert.IsTrue(dictA.Keys.All(k => dictB.ContainsKey(k)); 
Assert.IsTrue(dictB.Keys.All(k => dictA.ContainsKey(k)); 

var cmp = new ClassEqualityComparer(); 
Assert.IsTrue(dictA.Keys.All(k => cmp.Equals(dictA[k], dictB[k])); 

威爾說工作?

+0

馬特,這將工作;事實上,我有我自己的版本的代碼,或多或少都是一樣的東西。但我想要一些內置的東西。所有的字典比較應該足夠普遍以保證在NUnit中有位置,或者不是? – Graviton 2010-02-01 15:23:00