CollectionAssert utiliser avec les génériques?
Il semble que CollectionAssert
ne peut pas être utilisé avec les médicaments génériques. C'est super frustrant, le code que je veux tester ne utiliser des génériques. Que dois-je faire? Écrire réutilisable pour convertir entre les deux? Manuellement, vérifiez les collection d'équivalence?
D'échec:
ICollection<IDictionary<string, string>> expected = //...
IEnumerable<IDictionary<string, string>> actual = //...
//error 1 and 2 here
CollectionAssert.AreEqual(expected.GetEnumerator().ToList(), actual.ToList());
//error 3 here
Assert.IsTrue(expected.GetEnumerator().SequenceEquals(actual));
Des erreurs du compilateur:
Erreur 1:
'Système.Les Collections.Génériques.IEnumerator>' ne contient pas une définition pour 'ToList' et aucune méthode d'extension 'ToList' acceptant un premier argument de type 'System.Les Collections.Génériques.IEnumerator>' a pu être trouvé
Erreur 2
'Système.Les Collections.Génériques.IEnumerator>' ne contient pas une définition pour 'ToList' et aucune méthode d'extension 'ToList' acceptant un premier argument de type 'System.Les Collections.Génériques.IEnumerator>' a pu être trouvé
Erreur 3
'Système.Les Collections.Génériques.IEnumerator>' ne contient pas une définition pour 'SequenceEquals' et aucune méthode d'extension 'SequenceEquals' acceptant un premier argument de type 'System.Les Collections.Génériques.IEnumerator>' a pu être trouvé
Ce que je fais mal? Je ne suis pas à l'utilisation des extensions correctement?
Mise à jour: Ok, cela ressemble un peu mieux, mais ne fonctionne toujours pas:
IEnumerable<IDictionary<string, string>> expected = //...
IEnumerable<IDictionary<string, string>> actual = //...
CollectionAssert.AreEquivalent(expected.ToList(), actual.ToList()); //fails
CollectionAssert.IsSubsetOf(expected.ToList(), actual.ToList()); //fails
Je ne veux pas être la comparaison des listes; je ne se soucient définir l'appartenance de l'égalité. L'ordre des membres est sans importance. Comment puis-je contourner ce problème?
- Êtes-vous sûr? Il a été de me donner des erreurs de compilation, que je poste demain matin.
- J'ai eu tort; CollectionAssert ne fonctionnera PAS sur un ICollection<T>. Il fonctionne avec ICollection seulement. Cela a été demandé lors de la connexion, mais pour l'instant pas mis en œuvre. Possible travail autour de: stackoverflow.com/questions/662458/...
- Si je me souviens bien, le ICollection et ICollection<T> les interfaces sont TRÈS différents. Ce n'est pas le cas de IEnumerable contre IEnumerable<T>. Veuillez vérifier leurs méthodes. ICollection est utilise pour AUTRE chose que ICollection<T>. ICollection n'ont même pas de méthode ADD - il est utilisé pour "plus bas niveau" des buts comme le multithreading et de l'ordonnancement. Donc, je pense que vous devriez plutôt de trouver une interface qui permettra de répondre à vos besoins, simple IEnumerable peut-être?
- "L'ordre des membres n'a pas d'importance" - c'est exactement ce que
CollectionAssert.AreEquivalent
est pour. Quel est le message d'erreur que vous obtenez avec le test? (peut-être que votre attendues et réelles ne sont pas équivalents!) - C'est SequenceEqual, pas SequenceEquals, c'est probablement ce que votre erreur de compilation
- 3 devrait fonctionner, c'est ce que j'utilise Affirmer.IsTrue(prévu.SequenceEqual(réel));
- Microsoft open-source de cette bibliothèque encore? Pouvons-nous déclarer et de régler le problème, alors
CollectionAssert.AreEqual
fonctionne avec plusieurs types?
Vous devez vous connecter pour publier un commentaire.
Vous peut utilisation CollectionAssert générique de collections. Le truc, c'est de comprendre que la CollectionAssert méthodes fonctionnent sur
ICollection
, et bien que quelques génériques de collecte des interfaces de mettre en œuvreICollection
,List<T>
n'.Ainsi, vous pouvez contourner cette limitation en utilisant le
ToList
méthode d'extension:Cela dit, je considère toujours CollectionAssert cassé en a beaucoup d'autres façons, j'ai donc tendance à utiliser Assert.IsTrue avec l'extension LINQ méthodes, comme ceci:
FWIW, je suis actuellement à l'aide de ces méthodes d'extension pour effectuer d'autres comparaisons:
ToList
est une méthode d'extension.using System.Linq;
mais cela ne fonctionne toujours pas:'System.Collections.Generic.IEnumerator<System.Collections.Generic.IDictionary<string,string>>' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerator<System.Collections.Generic.IDictionary<string,string>>' could be found
ToList
ne s'étend pasIEnumerator<T>
, il s'étendIEnumerable<T>
. Supprimer l'appel àGetEnumerator()
.Si vous travaillez avec des Sets, puis utiliser cet Idiome
Vous pouvez facilement écrire votre propre version générique, puis le déplacer d'une base ou d'une classe utilitaire qui est utilisé dans l'ensemble de vos tests. De Base sur les opérateurs LINQ à l'instar de Tous et de Tout.