2010-01-13 1 views
4

J'ai un scénario de test où je veux vérifier si deux collections sont égales. J'ai trouvé la classe Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert, mais cela ne fonctionne que sur ICollection<T>. Puisque je suis en train de tester un référentiel pour Entity Framework, et que j'ai donc besoin de comparer IObjectSet<T>, cela ne fonctionnera pas - IObjectSet<T> n'implémente pas ICollection<T>.Est-il possible d'utiliser Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert sur un IEnumerable <T>?

Est-il possible d'utiliser cette classe pour comparer les collecitons, ou dois-je créer ma propre implémentation? (Et pourquoi diable ne pas l'équipe Microsoft faire le travail en classe avec IEnumerable<T> à la place, car c'est la "interface de base" pour les collections?)

EDIT: Ceci est mon code de test:

// Arrange 
var fakeContext = new FakeObjectContext(); 
var dummies = fakeContext.Dummies; 
var repo = new EFRepository<DummyEntity>(fakeContext); 

// Act 
var result = repo.GetAll(); 

// Assert 
Assert.IsNotNull(result, NullErrorMessage(MethodName("GetAll"))); 
Assert.IsInstanceOfType(result, typeof(IEnumerable<DummyEntity>), IncorrectTypeMessage(MethodName("GetAll"), typeof(IEnumerable<DummyEntity>))); 
CollectionAssert.AreEqual(dummies.ToList(), result.ToList()); 

L'appel CollectionAssert.AreEqual sur la dernière ligne échoue, indiquant que les éléments à l'index 0 ne sont pas égaux. Qu'est-ce que je fais mal?

Répondre

3

Une option effrontée (pas autant d'informations cependant) est d'affirmer que expected.SequenceEqual(actual) renvoie true.

Vous pouvez écrire une méthode wrapper qui force une collection (.ToList() sur chacun)? Mais pour être honnête, vous pourriez tout aussi bien appeler .ToList() dans le code de test unitaire:

CollectionAssert.AreEqual(expected.ToList(), actual.ToList()); // but tidier... 
+0

Avec '.ToList()' appelle sur toutes mes collections, le code compile. Cependant, je suis incapable d'écrire un test que je peux passer - voir le code que j'ai fourni dans une modification à mon message. –

+0

Il s'avère que l'implémentation de '.Equals()' sur 'DummyEntity' a fait l'affaire. –

2

Si vous comparez résultat que vous fixe pouvez utiliser CollectionAssert.AreEquivalent qui ne tiendra pas compte de l'ordre. Vous devez également vous assurer que vous avez implémenté Equals sur le type d'éléments que vous comparez.

+0

Je veux réellement que l'assertion se soucie de l'ordre, mais en implémentant '.Equals()' en combinaison avec l'appel '.ToList()' sur les collections (que j'aurais dû faire de toute façon pour utiliser 'CollectionAssert.AreEquivalent', ce qui explique pourquoi il a obtenu le représentant et pas vous) a fait l'affaire. Merci! –

Questions connexes