Comparer deux objets à L'aide D'Assert.AreEqual()

<!-J'écris des cas de test pour la première fois dans visual studio c # j'ai une méthode qui retourne une liste d'objets et je veux la comparer avec une autre liste d'objets en utilisant le Assert.AreEqual() méthode.

j'ai essayé de le faire mais l'affirmation échoue même si les deux objets sont identiques.

je voulais savoir si cette méthode, les deux paramètres de la comparaison de références ou le contenu de l'objet,

Dois-je la surcharge de l' == opérateur à faire ce travail?

25
demandé sur hakre 2013-03-21 16:21:21

5 réponses

Si vous utilisez NUnit c'est ce que dit la documentation

à partir de la version 2.2, des dispositions spéciales sont également prévues pour comparer des matrices unidimensionnelles. Deux tableaux seront traités comme l'égalité par le faire Valoir.Sont égaux s'ils sont de même longueur et chacun des éléments correspondants sont égaux. Note: tableaux multidimensionnels, tableaux imbriqués (tableaux de tableaux) et autres types de collecte tels que ArrayList ne sont pas actuellement soutenu.

en général si vous comparez deux objets et que vous voulez avoir l'égalité basée sur la valeur, vous devez Outrepasser le Equals méthode.

Pour réaliser ce que vous êtes à la recherche pour essayer quelque chose comme cela:

class Person 
{
    public string Firstname {get; set;}
    public string Lastname {get; set;} 

    public override bool Equals(object other) 
    {
      var toCompareWith = other as Person;
      if (toCompareWith == null) 
        return false;
      return this.Firstname ==  toCompareWith.Firstname && 
          this.Lastname ==  toCompareWith.Lastname; 
    }
}  

et dans votre unité de test:

Assert.AreEqual(expectedList.ToArray(), actualList.ToArray());
19
répondu anouar.bagari 2015-10-14 22:17:27

Ces réponses sont trop compliquée pour la question. Il n'y a pas de dérogations nécessaires pour comparer deux listes, et vous n'avez pas besoin de faire apparaître plusieurs assertions. Microsoft utilise la classe suivante, CollectionAssert.

CollectionAssert.AreEqual(expectedList, actualList)

cela fonctionne pour les listes, les dictionnaires, et tout ce qui implémente l'interface ICollection.

La documentation de microsoft est à l'emplacement suivant, et détaille les différents types d'affirmations qui peuvent être faites sur collections

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx

cependant, comme mentionné par @Bart, cela ne fonctionne pas comme prévu sur les listes d'objets (complexes), et la méthode Equals peut encore avoir besoin d'être écrasée pour ces cas.

34
répondu a-1 2015-03-24 15:44:13

vous pouvez les sérialiser et tester la chaîne résultante.

5
répondu Radu Cosoveanu 2015-07-14 15:08:20

affirmer.AreEqual xUnit on .NET vérifiera si les objets sont identique cependant l'identité de l'objet est différente de l'égalité de valeur il semblerait que vous cherchiez l'égalité de valeur. IE. "Sont les objets de ma liste de la même valeur?"qui est pourquoi il "échoue" les deux listes ne sont pas identiques même si les valeurs de chaque objet, dans chaque liste peut représenter la même valeur.

généralement dans un effort de test, il devrait être suffisant pour tester le nombre d'une collection et les éléments clés.

var count = listA.Count;
Assert.AreEqual(count,listB.Count);
Assert.AreEqual(listA.First(),listB.first());
Assert.AreEqual(listA.Last(),listB.Last());
Assert.AreEqual(listA[count/2],listB[count/2]);

le dernier test n'a pas à être à l'élément du milieu et est simplement destiné à tester un élément de la liste.la seule raison pour laquelle il n'est pas un élément aléatoire est parce que vous voulez être en mesure de reproduire vos résultats de test.

2
répondu Rune FS 2018-05-16 09:41:43

affirmer.AreEqual () compare les références. Habituellement lors de la comparaison des listes je compare le nombre des articles et que certaines propriétés d'un article exact dans la liste ou directement l'article dans la liste (mais encore une fois, il est la référence).

si vous voulez comparer des objets par contenu, Vous n'avez pas besoin d'implémenter un Compareur d'objets récursif, mais je ne pense pas que ce soit approprié pour les tests unitaires, parce que vous voulez qu'ils s'exécutent toujours aussi vite que possible.

0
répondu hoonzis 2013-03-21 12:28:28