XUnit Affirmation pour la vérification de l'égalité des objets
Je suis en utilisant XUnit cadre de tester mon code C#.
Est-il une méthode assert disponibles dans ce cadre qui fait l'objet de comparaison? Mon intention est de vérifier l'égalité de chaque objet publiques et privées de variables membres.
J'ai essayé ces solutions de rechange, mais rarement cela fonctionne:
1) bool IsEqual = (Obj1 == Obj2)
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally
- Il est "profond" de comparaison dans xUnit. Vous aurez à mettre en œuvre IEquatable<T> pour vos objets, et ensuite faire Valoir.Est égal à fonctionner.
Assert.Same()
compare par référence; elle affirme queObj1
etObj2
sont le même de l'objet plutôt que de simplement cherche sur le même.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'un custom comparer pour atteindre cet objectif, lorsque vous comparez des objets autrement, ils sont vérifiés sur la base de savoir s'ils font référence au même objet en mémoire. Pour remplacer ce comportement, vous devez remplacer le
Equals
etGetHashCode
méthode, puis vous pouvez faire:Voici une page MSDN abt surcharge de méthode Equals: http://msdn.microsoft.com/en-us/library/ms173147(v=vs. 80).aspx
Également apt le commentaire sur la question: Quelle est la différence entre IEquatable et juste primordial de l'Objet.Equals()?
J'ai eu le même problème, mais alors heureusement que je suis déjà à l'aide de
Donc j'ai juste eu à sérialiser objet json puis comparer comme une chaîne de caractères.
Je sais que c'est une vieille question, mais depuis que je suis tombé sur ça j'ai pensé peser avec une nouvelle solution qui est disponible (au moins dans xunit 2.3.1 dans un .net Core 2.0 solution).
Je ne suis pas sûr de quand il a été introduit, mais il est maintenant une surcharge forme de
.Equal
qui accepte une instance deIEqualityComparer<T>
comme troisième paramètre. Vous pouvez créer un personnalisé comparer dans votre unité de test sans polluer votre code avec elle.Le code suivant peut être invoquée comme ceci:
Assert.Equal(expectedParameters, parameters, new CustomComparer<ParameterValue>());
XUnit nativement semble arrêter le traitement d'un test dès qu'une erreur est rencontrée, afin de lancer une nouvelle
EqualException
de l'intérieur de notre comparateur semble être en ligne avec la façon dont XUnit fonctionne hors de la boîte.Edit: j'ai trouvé que la comparaison entre le réel et les valeurs attendues avec
!=
n'a pas été efficace pour certains types (je suis sûr qu'il y a une meilleure explication impliquant la différence entre les types de référence et des types de valeur, mais ce n'est pas pour aujourd'hui). J'ai mis à jour le code pour utiliser le.Equals
méthode pour comparer deux valeurs et qui semble fonctionner beaucoup mieux.Il y a des packages NuGet qui le font pour vous.
Voici deux exemples que j'utilise personnellement.
DeepEqual:
ExpectedObjects: