C# UnitTest - Geltend Zu Machen.AreEqual() ruft nicht Gleich, wenn das argument null ist
vor kurzem habe ich stolperte über eine scheinbar seltsame Verhalten, dass Google völlig gescheitert zu erklären.
using Microsoft.VisualStudio.TestTools.UnitTesting;
class TestClass
{
public override bool Equals(object obj)
{
return true;
}
}
[TestMethod]
public void TestMethod1()
{
TestClass t = new TestClass ();
Assert.AreEqual (t, null); //fails
Assert.IsTrue (t.Equals (null)); //passes
}
Ich würde erwarten, dass dieser test erfolgreich zu sein. Aber in Visual Studio 2008 /.NET 3.5, versagt er. Ist es vorbestimmt, so zu sein oder ist es ein bug?
Da der erwartete Wert in NUnit ist immer die erste, die Sie verwenden AreEqual() rückwärts von der Konvention. Ich kann nicht sagen, von den docs, wenn er vergleicht t gegen null oder null gegen t, so würde ich das nicht nennen, einen test stützt sich auf die Unterscheidung zuverlässig.
InformationsquelleAutor mafu | 2009-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Testklasse gegen den Vertrag von
- Objekt.Equals
.Assert.AreEqual
ist unter Berufung auf diesen Vertrag, ganz vernünftig.Docs-Zustand (in der Liste der Anforderungen):
Die assert-Pässe denn die Umsetzung ist gegen den Vertrag.
t.Equals(null)
sollte wieder falsch, aber Sie können sehen, von der Umsetzung, dass es tatsächlich "true" zurückgeben, damit das gebrochene Behauptung geht.Ah, ich war der Annahme, der Rahmen würde ein überspringen der tatsächlichen Umsetzung im Falle von Null-und nur false zurück.
Wie konnten Sie es? Machen Sie einen virtuellen Methodenaufruf in der letzten Zeile - es gibt keine code-Entscheidungen andere als die Umsetzung zu nennen, die zwischen Ihre Linie und die
Equals
Methode selbst. Wenn Sie möchten, genanntobject.Equals(t, null)
dass wäre ein anderes gewesen.Nein,
whatever.Equals(null)
machen es durch IhreEquals
Methode. AllerdingsAssert.AreEqual
ist null bewusst. Das ist der Unterschied.InformationsquelleAutor Jon Skeet
Beim Test für null-Werte, verwenden Sie nicht
Assert.AreEqual
.Verwenden Sie
Assert.IsNull()
.InformationsquelleAutor Jon Limjap
Den ersten test schlägt fehl. Testen, ob "t" null ist, das ist nicht, weil Sie initialisiert die t mit einem neuen TestClass-Objekt.
Zweiten test geht, weil t.Gleich gibt immer true zurück.
Wenn einer der Tests fehlschlägt, die gesamte TestMethod1 wird als fehlgeschlagen markiert.
InformationsquelleAutor Xn0vv3r
Nein, es ist richtig - Sie haben t initialisiert, um eine neue TestClass-Objekt, das nicht null ist, also die assertion fehlschlägt.
InformationsquelleAutor gkrogers
Wenn ich dir Recht, es ist tatsächlich so gedacht, dass
AreEqual(anythingButNull, null)
immer false zurück?(edit) Der Grund warum ich fragte ist, weil der test für die null, wie Sie durch den Vertrag von gleich zu Gleich, nicht aufgerufen wird, wenn unittesting der Klasse. So, da AreEqual stützt sich auf den Vertrag, es schlägt fehl, um zu überprüfen, ob meine Klasse auch mit dem Vertrag entspricht. Also ich denke, ich muss die Problemumgehung verwenden von
Assert.IsFalse(blah.Equals(null))
.Ja, weil, einfach gesprochen, (!null==null) return false.
InformationsquelleAutor mafu