2010-02-01 84 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