2010-02-01 4 views
2

Étant donné deux dictionnairesNUnit: L'API pour vérifier si deux dictionnaires sont les mêmes

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

Comment vérifier si ces deux dictionnaires sont les mêmes? La capture ici est que je ne peux pas utiliser le classA.Equals par défaut pour comparer les paires de valeurs. Au lieu de cela, le test passera quand et seulement si donné que tous les objets du type classA dans les dictionnaires doivent satisfaire mon propre code personnalisé IEqualityComparer<ClassA>.

Plus précisément, je regarde quelque chose comme

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

avec ClassEqualityComparer hérite de IEqualityComparer<ClassA>, ou équivalent. Je ne me dérange pas si je dois un type sous-classe NUnit de IEqualityComparer (comme IResolveConstraint), mais la chose la plus importante est que la méthode Assert doit être quelque chose comme

Assertion(dictA, dictB, EqualityComparer) 

Ou quelque chose encore plus simple; Je ne veux pas utiliser Assert.That puis implémenter un type de IResolveConstraint qui s'exécute dans des pages juste pour vérifier si deux dictionnaires sont identiques.

Une idée?

Répondre

0

Si vous avez le contrôle sur l'instanciation de ces dictionnaires dans vos tests unitaires, vous pouvez passer un comparer au constructor approprié.

+0

Que le comparateur compare seulement la clé du dictionnaire, il ne compare pas entre les valeurs. – Graviton

+0

Si vous souhaitez comparer des valeurs, une liste serait un type de données plus approprié qu'une table de hachage. –

+0

Je ne peux pas parce qu'une comparaison de liste signifierait que je dois obtenir l'ordre de l'article juste. Dans ma comparaison, les commandes ne sont pas importantes. – Graviton

2

donc je suppose que vous devez tester ce dictionnaire « B » contient toutes les mêmes touches que « A » et vice-versa, puis utilisez votre comparateur pour comparer chaque valeur:

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 qui travail?

+0

Matt, ça va marcher; en fait j'ai ma propre version de code qui fait plus ou moins la même chose. Mais je veux quelque chose de intégré. Après toute comparaison de dictionnaire devrait être assez commun pour justifier une place dans NUnit, ou non? – Graviton

Questions connexes