NUnit vergleicht zwei Listen

7

OK, ich bin ziemlich neu in der Unit-Tests und alles läuft gut bis jetzt. Ich vereinfache mein Problem hier, aber im Grunde habe ich folgendes:

%Vor%

Aber der Test scheitert, sollte der Test nicht bestanden werden? Was vermisse ich?

    
SOfanatic 08.11.2013, 14:36
quelle

6 Antworten

5

Ich konvertiere meinen Kommentar zur Antwort auf Anfrage.

Nun, das scheitert, weil AreEqual einen Referenzvergleich verwendet. Damit es funktioniert, benötigen Sie einen Vergleich der Werte (Ihren eigenen benutzerdefinierten Vergleich).

Sie können das praktisch tun, indem Sie IEquatable implementieren Schnittstelle. Wenn Sie diese Schnittstelle implementieren, müssen Sie zusätzlich Object.Equals und Object.GetHashCode überschreiben, um konsistente Ergebnisse zu erhalten.

.Net-Framework unterstützt dies, ohne IEquatable zu implementieren. Sie müssen IEqualityComparer , das sollte den Trick machen, aber nunit sollte eine Methode haben, die das als Überladung annimmt. Bin aber nicht sicher über "Nunit".

    
Sriram Sakthivel 08.11.2013, 15:00
quelle
21

Wenn Sie zwei Listen vergleichen, sollten Sie einen Test mit Erfassungsbeschränkungen durchführen .

%Vor%

Außerdem müssen Sie in Ihren Klassen die Equals-Methode überschreiben, ansonsten werden die Elemente in der Liste, wie angegeben, weiterhin anhand der Referenz verglichen.

Einfaches Übersteuerungsbeispiel:

%Vor%     
matth 08.11.2013 14:59
quelle
5

Eine sehr einfache Methode, um diesen Test zum Laufen zu bringen, besteht darin, die Instanz MyOtherClass nur einmal zu erstellen. Auf diese Weise sind sie beim Vergleich der Elemente in den beiden Listen "gleich" (weil sie auf dasselbe Objekt verweisen). Wenn Sie dies tun, wird CollectionAssert gut funktionieren.

%Vor%

Wenn Sie dies nicht tun, müssen Sie IEquatable<MyOtherClass> in MyOtherClass oder override Equals implementieren, um zu definieren, was zwei Instanzen dieser Klasse zu "gleich" macht.

    
Jeff Bridgman 08.11.2013 14:51
quelle
3

Versuchen Sie etwas genauer zu sein, was Sie erreichen möchten. Explizit zu sagen, dass Sie die gesamte Sequenz vergleichen möchten, wird das Problem lösen. Ich persönlich würde mich nicht auf NUnit-Funktionen verlassen, um zu bestimmen, was Sie mit "AreEqual" meinen. ZB

%Vor%     
Klark 08.11.2013 14:49
quelle
1

Von Nunit Dokumentation :

  

Ab Version 2.2 wird auch der Vergleich von single-dimensioned arrays vorgesehen. Zwei Arrays wird als gleich mit Assert.AreEqual behandelt werden, wenn sie die gleiche Länge haben und jedes der entsprechenden Elemente gleich ist. . Hinweis: Multi-dimensionierten Arrays, verschachtelte Arrays (Arrays von Arrays) und andere Sammlungstypen wie Arraylist werden derzeit nicht unterstützt

Sie haben eine Liste von Objekten ... also ist es nicht das Gleiche wie beim Vergleich von 2 Ints. Was Sie tun sollten, ist wahrscheinlich vergleichen, alle Objekte in der Liste ... (Versuchen Sie Ihre Liste in ein Array konvertieren ... könnte tatsächlich funktionieren :))

Wie ich schon sagte (und die meisten anderen auch), müssen Sie Equals wahrscheinlich überschreiben. Hier MSDN Seite darüber, wie es zu tun (Briefe Equals, = = Operator und GetHashCode).

Ähnlich mit mehr Infos: [compare-equality-zwischen-zwei-objects-in-nunit]
(Vergleichen Sie Gleichheit zwischen zwei Objekten in NUnit )

    
Noctis 08.11.2013 14:45
quelle
0

Wenn Sie eine Klasse nicht ändern können, dann kann dieses Beispiel hilfreich sein:

%Vor%     
Pavel Yermalovich 09.06.2015 18:15
quelle

Tags und Links