Wenn ich ein Dictionary<string, int> actual
habe und dann ein komplett neues Dictionary<string, int> expected
mit den gleichen Werten wie actual erstelle.
Durch Aufruf von Assert.That(actual, Is.EqualTo(expected));
wird der Test bestanden.
Bei Verwendung von Assert.That(actual, Is.EquivalentTo(expected));
wird der Test nicht bestanden.
Was ist der Unterschied zwischen EqualTo()
und EquivalentTo()
?
Bearbeiten:
Die Meldung der Ausnahme, wenn der Test nicht erfolgreich ist, lautet wie folgt:
%Vor%Mein Code sieht so aus:
%Vor%Beides funktioniert für mich:
%Vor% Is.EqualTo()
in NUnit, wenn beide Objekte ICollection
sind, wird CollectionsEqual(x,y)
verwendet, die beide iteriert, um den Unterschied zu finden. Ich denke, es ist gleich Enumerable.SequenceEqual(x,y)
Is.EquivalentTo
macht dies sofort, weil nur die folgenden Sequenzen unterstützt werden: EquivalentTo(IEnumerable)
Der Titel der Frage zwingt mich, Folgendes zu sagen:
Bei Aufzählungen führt Is.EquivalentTo()
den Vergleich durch und erlaubt eine beliebige Reihenfolge der Elemente.
Im Gegensatz dazu berücksichtigt Is.EqualTo()
die genaue Reihenfolge der Elemente wie Enumerable.SequenceEqual()
.
In Ihrem Fall gibt es jedoch kein Problem mit der Bestellung. Der Hauptpunkt hier ist, dass Is.EqualTo()
zusätzlichen Code für den Wörterbuchvergleich hat, wie hier .
Nicht so Is.EquivalentTo()
. In Ihrem Beispiel vergleicht es Werte vom Typ KeyValuePair<string,List<int>>
für Gleichheit mit object.Equals()
. Da die Wörterbuchwerte vom Referenztyp List<int>
sind, wird die Referenzgleichheit für den Vergleich verwendet.
Wenn Sie Ihr Beispiel so ändern, dass die Liste {1, 2} nur einmal instanziiert und in beiden Wörterbüchern verwendet wird, wird Is.EquivalentTo()
erfolgreich sein.
Tags und Links .net unit-testing nunit nunit-2.5