C # Assert.AreNotEqual contre Equals
Question
Tout en essayant de vérifier à moi-même, que C # Equals pour IEnumerables est une référence égale, j'ai trouvé quelque chose de bizarre. Avec la configuration suivante dans NUnit
var a = (IEnumerable<string>)(new[] { "one", "two" });
var b = (IEnumerable<string>)(new[] { "one", "two" });
ce test
Assert.IsFalse(a.Equals(b));
passe, alors que ce test
Assert.AreNotEqual(a, b);
ne fonctionne pas. Quelqu'un peut-il expliquer pourquoi?
Edit: Merci pour les réponses. Je viens de lire la documentation pour NUnit, et il dit la même chose, que AreEqual et AreNotEqual avec le test de recouvrement pour l'égalité de chaque élément de la collection. Je suppose que je suis coincé avec l'idée que AreEqual et AreNotEqual était juste en utilisant Equals plaine.
La solution
L'appel à a.Equals(b)
retours false
car a et b ne sont pas les mêmes objets (mais ils sont bien sûr identiques énumérations). La méthode Equals
, sauf contrordre, compare automatiquement les objets par leur référence, qui est ce qui se passe dans ce cas.
Assert.AreNotEqual
est un peu plus intelligent que cela. Il est conçu pour des fins de débogage, contrairement à la méthode Equals
, il compare en fait les séquences produites par les deux énumérations, puisqu'il reconnaît IEnumerable<T>
comme un type spécial. Vous devriez également remarquer qu'il fait d'autres choses intéressantes, comme le retour true
lorsque les deux paramètres sont numériquement identiques mais différents types de valeurs (par exemple short
et long
).
L'espoir qui aide.
Autres conseils
Je n'ai pas regardé le code source NUnit pour voir comment les gars NUnit codés AreNotEqual. Cependant, je peux vous dire comment faire pour MbUnit qui a le même comportement.
D'abord dans AssertNotEqual (a, b) vérifie si les références sont égaux en exécutant le code comme ceci:
if (Object.ReferenceEquals(left, right))
return true;
Dans votre cas, il va à l'échec. Ensuite, il vérifie si les objets sont de type IEnumerable. Si elles sont, itérer et les comparer si les articles sont les mêmes et dans le même ordre.
Cependant, dans le type de T IEnumerable est plus complexe que la chaîne ou ValueType dans MbUnit AssertNotEqaual (a, b) ne manquera pas.
var a = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") });
var b = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") });
Assert.IsFalse(a.Equals(b)); // Success
Assert.AreNotEqual(a, b); // Success