Funktioniert NUnit's Is.EqualTo nicht zuverlässig für Klassen, die von generischen Klassen abgeleitet sind?

8

Heute habe ich das folgende Problem mit NUnit bekommen.

Ich habe eine Klasse, die von einer generischen Klasse abgeleitet ist. Ich begann, einige Serialisierungstests zu machen und testete auf Gleichheit mit der Is.EqualTo () - Funktion von NUnit.

Ich fing an zu vermuten, dass etwas nicht stimmt, wenn stattdessen ein Test bestanden wurde, der nicht bestanden werden sollte. Wenn ich stattdessen obj1.Equals (obj2) verwendet habe, ist es fehlgeschlagen.

Um zu untersuchen, habe ich die folgenden Tests erstellt:

%Vor%

Die zwei (tatsächlich widersprüchlichen Behauptungen) im zweiten Test zeigen das Problem:

%Vor%

Dieser Test sollte auf die eine oder andere Weise fehlschlagen, tut es aber nicht!

Also habe ich ein wenig in NUnits Quellcode gegraben, nur um zu finden, dass nach einigen if () s für einige spezielle Bedingungen die ObjectsAreEqual (Objekt x, Objekt y) -Methode (die schließlich über Assert.That ( x, Is.EqualTo (y)), kommt zu dieser Codezeile:

%Vor%

Ich finde das sehr verblüffend, da ich jetzt denken muss, dass Is.EqualTo () nur einen längeren Weg nimmt, aber im Grunde sollte es dasselbe tun wie x.Equals (y)

Hier die vollständige Methode für alle, die interessiert sind (innerhalb des Namensraums NUNit.Framework.Constraints):

%Vor%

Also, was ist hier los und wie kann es behoben werden?

Ich möchte meinen Tests und damit unbedingt NUnit wieder vertrauen können.

Ich möchte auch nicht Equals () anstelle von Is.EqualTo () verwenden (die erstere gibt mir keine so gute Ausgabe, wenn der Test fehlschlägt).

Vielen Dank im Voraus.

Aktualisierung:

In der Zwischenzeit habe ich mit diesem Problem weiter gerungen und ein ähnliches Problem gefunden hier und gab eine mögliche Problemumgehung bekannt.

    
Thorsten Lorenz 26.10.2009, 13:39
quelle

1 Antwort

5

Das Problem ist, dass die zweite Behauptung des zweiten Tests die Equals Überladung aufruft, die eine object statt einer Client<T> akzeptiert, so dass dieser Vergleich false zurückgibt:

%Vor%

Um dies zu beheben, können Sie die Vergleichsoperation wie folgt ändern:

%Vor%     
Jeff Sternal 26.10.2009, 14:59
quelle

Tags und Links