Assert.Equals von NUnit löst die Ausnahme "Assert.Equals sollte nicht für Assertions verwendet werden" aus.

132

Ich habe kürzlich versucht, die Methode Assert.Equals () zu verwenden, wenn ich einen neuen NUnit-Test schreibe. Bei der Ausführung gibt diese Methode die AssertionExceptionAussage aus, dass Assert.Equals should not be used for Assertions. dies auf den ersten Blick etwas verwirrend ist. Was ist denn hier los?

Odrade
quelle
Können Sie uns einen Kontext geben, wie zum Beispiel den speziellen Code, in dem sich dieser befand? Welche Art von Objekten haben Sie verglichen usw.?
Mike Parkhill
9
Entschuldigung, aber ich habe bereits die Antwort auf diese Frage gefunden. Ich habe es nur gefragt, damit ich die Antwort für die Nachwelt posten kann. Der Kontext ist nicht wirklich wichtig, wie Sie anhand der Antwort sehen werden. Ich hoffe, dass diese Antwort über die Websuche in der Ausnahmemeldung leicht auffindbar ist.
Odrade

Antworten:

201

Assertist eine statische Klasse, die von System.Object erbt, wie dies alle Klassen implizit in c # tun. System.Object implementiert die folgende Methode:

static bool Equals(object a, object b)

Die Methoden auf Assert, die für den Gleichheitsvergleich vorgesehen sind, sind die Assert.AreEqual()Methoden. Daher ist das Aufrufen der Object.Equals()Methode über die Assert-Klasse in einem Komponententest sicherlich ein Fehler. Um diesen Fehler zu vermeiden und Verwirrung zu vermeiden, haben die Entwickler von NUnit Object.Equalsdie Assert-Klasse absichtlich mit einer Implementierung versteckt, die eine Ausnahme auslöst. Hier ist die Implementierung:

/// <summary>
 /// The Equals method throws an AssertionException. This is done 
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

Natürlich ist die Ausnahmemeldung selbst verwirrend, aber zumindest lässt sie Sie wissen, dass Sie etwas falsch gemacht haben.

Odrade
quelle
13
Die Nachricht ist verwirrend, aber geben Sie sie in Google ein und Sie landen hier bei dieser Antwort und alles ist in Ordnung. Danke Odrade.
Stephen Holt
25
Die Entwickler von NUnit könnten die Nachricht in "... use Assert.AreEqual ()" ändern.
WillC
Warum haben sie die Equals-Methode nicht einfach privat gemacht?
Shytikov
4
@shytikov Weil das unmöglich ist. Sie können eine virtuelle Methode aus einer Basisklasse nicht mit einer privaten überschreiben.
Odrade
18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

nicht:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Doug
quelle