2012-04-20 7 views
8

Ich versuche, zwei Listen zu vergleichen mitCollectionAssert.AreEqual Failing

CollectionAssert.AreEqual(ListExpected, ListActual); 

Aber ich bin immer eine Ausnahme

Expected and actual are both <System.Collections.Generic.List`1[API.Program.Relation]> with 11 elements 
    Values differ at index [0] 
    Expected: <API.Program.Relation> 
    But was: <API.Program.Relation> 

Aber wenn ich das Null-Element verglichen durch Feld alles mit Assert.AreEqual auf dem Feld war fein.

Jede Idee, warum ich nicht vergleichen kann CollectionAssert

+0

Sind sie eigentlich Referenz gleich? Selbst wenn alle Daten identisch sind, ist es möglicherweise nicht die gleiche Instanz. – Tejs

+3

sind die Elemente in den Sammlungen, die Sie vergleichen, wenn Sie "Equals" und "GetHashCode" richtig implementieren? –

+0

Waren die Referenzen von Element Null gleich oder nur die Feldwerte? – ken

Antwort

11

Ein Objekt wird mit „deklariert“ gleich einem anderen Objekt in .NET ist, wenn seine Equals(object other) Methode true zurückgibt. Sie müssen diese Methode für Ihre Klasse API.Program.Relation implementieren, da sonst .NET Ihre Objekte als unterschiedlich betrachtet, es sei denn, sie sind referenzgleich. Die Tatsache, dass alle Felder gleich sind, spielt für .NET keine Rolle: Wenn Sie Feld-für-Feld-Gleichheits-Semantiken benötigen, müssen Sie eine Implementierung von Equals bereitstellen, die dies unterstützt.

Wenn Sie Equals überschreiben, vergessen Sie nicht, auch GetHashCode zu überschreiben - diese müssen zusammen überschrieben werden.

Wenn Sie nicht wollen oder können nicht Equals aus irgendeinem Grund außer Kraft setzen, könnten Sie an overload of CollectionAssert.AreEqual verwenden, die eine Instanz von IComparer nimmt Elemente in Vergleich Sammlung zu unterstützen.

+3

Und wenn Sie Equals/GetHashCode überschreiben, sollten Sie auch die Klasse unveränderlich machen. –

+0

@HenkHolterman oder mindestens die Felder, die zur Berechnung von Gleichheit und Hash-Code verwendet werden – phoog