2012-06-21 13 views
5

Ich verwende XUnit-Framework, um meinen C# -Code zu testen.XUnit Assertion für die Überprüfung der Gleichheit von Objekten

Gibt es in diesem Framework eine Assert-Methode, die den Objektvergleich durchführt? Meine Absicht ist es, auf die Gleichheit von jeder der öffentlichen und privaten Mitgliedsvariablen des Objekts zu prüfen.

habe ich versucht, diese Alternativen, aber es funktioniert selten:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

Es gibt einen "tiefen Vergleich" in xUnit. Sie müssen IEquatable für Ihre Objekte implementieren, und dann wird Assert.Equals funktionieren. – seldary

+1

'Assert.Same()' wird durch Referenz verglichen; es behauptet, dass "Obj1" und "Obj2" das ** gleiche ** Objekt sind, anstatt nur ** dasselbe zu sehen. – TeaDrivenDev

Antwort

6

Sie benötigen einen benutzerdefinierten Vergleich zu haben, dies zu erreichen, wenn Sie Objekte vergleichen sie sonst auf der Grundlage geprüft werden, ob sie sich auf die gleiche beziehen Objekt im Speicher. Um dieses Verhalten zu überschreiben, müssen Sie die Equals und GetHashCode Methode außer Kraft zu setzen und dann könnten Sie tun:

Assert.True(obj1.Equals(obj2)); 

Hier ist ein MSDN-Seite ca. Überlastungen Equals-Methode: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

auch apt Kommentar auf die Frage: What's the difference between IEquatable and just overriding Object.Equals()?

+1

Ich verstehe, dass durch die Implementierung der benutzerdefinierten "Equals" -Methode diese Überprüfung durchgeführt werden kann. Aber gibt es irgendeine Methode, um einen Blind-Byte-Vergleich zu machen, was die Überprüfung einfacher macht? Dies liegt daran, dass ich am Ende eine "Equals" -Implementierung in "Software im Test" haben werde, nur um die Einheit zu testen. – inquisitive

+1

Ich versuchte Serialisierungsmethoden, um beide Objekte in ein Byte-Array zu konvertieren, und es funktionierte. Aber es kommt mit einer Einschränkung des Hinzufügens von [serializable] -Attribut zu meiner Klasse, die private Member-Variablen hat. Ich denke, das ist nicht gut in der Designperspektive – inquisitive

8

ich ähnliches Problem hatte, dann aber zum Glück bin ich schon mit

using Newtonsoft.Json; 

Also musste ich es nur zu json Objekt serialisieren und dann als String vergleichen.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

Ich halte dies für nützlicher als die Implementierung einer Equals-Methode, weil ich möchte, dass mein Assert-Fehler mir etwas darüber sagt, was falsch war. Idealerweise möchte ich etwas haben, das einen Objektbaum durchqueren und Informationen darüber sammeln kann, welche Eigenschaften/Teilbäume ungleich sind und mit diesen Informationen versagen. –

+0

@ RikkiGibson implementiert nicht Gleich ist der richtige Weg, es zu tun? Fügen Sie einfach Ausnahmen zu einer Liste im Gleichheitszeichen für jede Eigenschaft hinzu, die unterschiedlich ist. Am Ende geben Sie entweder true zurück oder werfen alle Ausnahmen. –

+0

Ja, aber es kann mühsam sein, von Fall zu Fall zu gehen Suchen Sie in der Vergangenheit nach reflexionsbasierten Lösungen, wenn Sie Bäume aus einfachen alten Objekten, Primitiven und Sammlungen vergleichen. –

Verwandte Themen