web-dev-qa-db-fra.com

Comparaison de deux objets à l'aide de 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 la méthode Assert.AreEqual().

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

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

Dois-je surcharger le == opérateur pour que cela fonctionne?

31
Vishweshwar Kapse

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

À partir de la version 2.2, une disposition spéciale est également prévue pour comparer les tableaux unidimensionnels. Deux tableaux seront traités comme égaux par Assert.AreEqual s'ils sont de la même longueur et que chacun des éléments correspondants est égal. Remarque: les tableaux multidimensionnels, les tableaux imbriqués (tableaux de tableaux) et d'autres types de collection tels que ArrayList ne sont pas actuellement pris en charge.

En général, si vous comparez deux objets et que vous souhaitez avoir une égalité basée sur les valeurs, vous devez remplacer la méthode Equals.

Pour réaliser ce que vous recherchez, essayez quelque chose comme ceci:

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 test unitaire:

Assert.AreEqual(expectedList.ToArray(), actualList.ToArray());
24
anouar.bagari

Ces réponses sont beaucoup trop compliquées pour le problème. Aucune substitution n'est nécessaire pour comparer deux listes et vous n'avez pas besoin de répartir 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 Microsoft se trouve à l'emplacement suivant et détaille les différents types d'assertions qui peuvent être faites sur les 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.

43
a-1

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

5
Radu Cosoveanu

Assert.AreEqual dans xUnit sur .NET vérifiera si les objets sont identiques mais l'identité de l'objet est différente de l'équivalence de valeur, il semblerait que vous recherchiez l'égalité de valeur. C'est à dire. "Les objets de ma liste ont-ils la même valeur?" c'est pourquoi il "échoue" les deux listes ne sont pas identiques même si les valeurs de chaque objet dans chaque liste peuvent représenter la même valeur.

Habituellement, dans un effort de test, il devrait suffire de tester le nombre d'une collection et des é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 ne doit pas nécessairement être à l'élément central et est simplement destiné à tester un élément de la liste, la seule raison pour laquelle ce n'est pas un élément aléatoire est parce que vous voudriez pouvoir reproduire vos résultats de test.

4
Rune FS

Assert.AreEqual () compare les références. Habituellement, lorsque je compare des listes, je compare le nombre d'éléments et certaines propriétés d'un élément exact de la liste ou directement l'élément de la liste (mais encore une fois, c'est la référence).

Si vous voulez comparer des objets par contenu, vous devez implémenter un Object Compare récursif, mais je ne pense pas que cela soit approprié pour les tests unitaires, car vous voulez qu'ils s'exécutent toujours aussi vite que possible.

1
hoonzis