开发者

NUnit: The API to Check Whether Two Dictionaries Are the Same

开发者 https://www.devze.com 2022-12-18 22:21 出处:网络
Given two dictionaries var dictA = new Dictionary<string, classA>(); var dictB = new Dictionary<string, classA>();

Given two dictionaries

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

How to check whether these two dictionaries are the same? The catch here is that I can't use the default classA.Equals for comparing the value pairs. Instead, the test will pass when and on开发者_如何学Cly when given that all the object of the classA type in the dictionaries must satisfy my own custom IEqualityComparer<ClassA>.

Specifically, I am looking at something like

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

with ClassEqualityComparer inherits from IEqualityComparer<ClassA>, or equivalent. I don't mind if I have to subclass a NUnit type of IEqualityComparer ( such as IResolveConstraint), but the most important thing is that the Assert method must be something like

Assertion(dictA, dictB, EqualityComparer)

Or something even more simpler; I don't want to use Assert.That and then implement a type of IResolveConstraint that runs into pages just to check whether two dictionaries are the same.

Any idea?


So I guess you'll need to test that dictionary "B" contains all the same keys as "A" and vice versa, and then use your comparer to compare each value:

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]));

Will that work?


If you have control over the instantiation of these dictionaries in your unit tests you may pass a comparer to the appropriate constructor.

0

精彩评论

暂无评论...
验证码 换一张
取 消