Assert.Equals de NUnit lève l'exception "Assert.Equals ne doit pas être utilisé pour les assertions"

132

J'ai récemment tenté d'utiliser la méthode Assert.Equals () lors de l'écriture d'un nouveau test NUnit. Lors de l'exécution cette méthode jette un AssertionExceptionénoncé que Assert.Equals should not be used for Assertions. c'est un peu déroutant à première vue. Que se passe t-il ici?

Odrade
la source
Pouvez-vous nous donner un contexte tel que le code particulier dans lequel cela se trouve? Quel type d'objets compariez-vous, etc.?
Mike Parkhill
9
Désolé, mais j'ai déjà trouvé la réponse à celle-ci. Je l'ai juste demandé pour pouvoir poster la réponse pour la postérité. Le contexte n'est pas vraiment important, comme vous le verrez en lisant la réponse. J'espère que cette réponse sera facilement détectable via une recherche sur le Web sur le message d'exception.
Odrade

Réponses:

201

Assertest une classe statique héritant de System.Object, comme toutes les classes le font implicitement en C #. System.Object implémente la méthode suivante:

static bool Equals(object a, object b)

Les méthodes sur Assert qui sont destinées à la comparaison d'égalité sont les Assert.AreEqual()méthodes. Par conséquent, appeler la Object.Equals()méthode via la classe Assert dans un test unitaire est certainement une erreur. Afin d'éviter cette erreur et d'éviter toute confusion, les développeurs de NUnit ont intentionnellement caché Object.Equalsdans la classe Assert avec une implémentation qui lève une exception. Voici l'implémentation:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

Bien sûr, le message d'exception lui-même est déroutant, mais au moins il vous permet de savoir que vous avez fait quelque chose de mal.

Odrade
la source
13
Le message est déroutant, mais entrez-le dans Google et vous vous retrouvez ici à cette réponse et tout va bien. Merci Odrade.
Stephen Holt
25
Les développeurs de NUnit pourraient changer le message pour dire "... use Assert.AreEqual ()".
WillC
Pourquoi n'ont-ils tout simplement pas rendu la méthode Equals privée à la place?
shytikov
4
@shytikov Parce que c'est impossible. Vous ne pouvez pas remplacer une méthode virtuelle d'une classe de base par une méthode privée.
Odrade
18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

ne pas:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Doug
la source