2016-04-26 17 views
4

Verfügt NUnit über Objekte, die IDisposable bei der Bereinigung implementieren? Mir ist klar, dass es verschiedene Möglichkeiten gibt, wie man ein Objekt in einer Methode entsorgt, aber wenn zum Beispiel die Methode fehlschlägt, bevor das Objekt entsorgt wird - wird sich NUnit darum kümmern? (Als Referenz bin ich auf v2.6 +)Verfügt NUnit über Objekte, die IDisposable implementieren?

Der spezifische Grund, den ich frage, ist für einen Fall, in dem ein Objekt, das IDisposable implementiert, erstellt wird, aber ich behaupte, dass eine Ausnahme bei der Erstellung ausgelöst wird. Wenn der Test fehlschlägt - und das Objekt erstellt wird, möchte ich keine Speicherleckprobleme haben.

Beispiel:

//Will the StreamReader instance here be disposed 
//Of if the assertion fails, and the instance is created? 
Assert.Throws<Exception>(() => new StreamReader(filename)); 

Ich weiß, dass dies funktionieren wird:

Assert.Throws<Exception>(() => 
{ 
    using (StreamReader sr = new StreamReader(filename)) { } 
} 

Aber es scheint nur, wie unnötiger Code, wenn NUnit Pflege der Entsorgung stattfinden wird, wenn notwendig.

+3

Ich kann keinen Weg sehen, dass NUnit zuverlässig wissen würde, dass nichts anderes auf das IDisposable verweist, damit es es sicher entsorgen kann. Ich möchte nicht auf Fälle eingehen, in denen eine Assertion referenzierte Objekte fälschlicherweise entsorgt. Es sollte jedoch nicht sehr schwierig sein, einen Test zu machen, machen Sie einfach ein Dummy-Einwegobjekt, setzen Sie einen Haltepunkt in dispose und überprüfen Sie den Stack-Trace, von dem aus er aufgerufen wird. –

+0

@JoachimIsaksson Ich frage mich, ob vielleicht NUnit die Entsorgung aller Objekte am Ende eines jeden Testfalls zwingt, da Tests nicht aufeinander angewiesen sein sollten, und alles, was in einem Testfall erstellt wurde, kann theoretisch sofort entsorgt werden Der Test ist abgeschlossen. Mir geht es gut mit der Einhaltung von Standard IDisposable Praktiken, aber ich frage mich, ob jemand eine definitive Antwort zu diesem Thema hat. – user2338408

+1

Ich stimme @Joachim zu. Nur um hinzuzufügen, ist das Hinzufügen eines '[TearDown]', um ein Objekt zu entfernen, wahrscheinlich der Weg zu gehen, anstatt der 'Assert.Throws (mit ...)' in Ihrer Frage. – Chris

Antwort

7

Nein, NUnit wird Ihre Objekte nicht auf diese Weise entsorgen. NUnit 3.x wird Test-Fixtures ablegen, die IDisposable sind, aber das ist es.

Sie geben an, dass es unnötig erscheint, zu disponieren, weil NUnit das für Sie tun kann, aber das ist falsch. Im Code in Ihrem Beispiel sieht es so aus, als würden Sie NUnit ein IDisposable-Objekt übergeben, aber tatsächlich übergeben Sie einen Delegate/Lambda/Codeblock, der zufällig ein IDisposable-Objekt enthält.

Sie werden feststellen, dass die Signatur für Assert.Throws ist;

public static TActual Throws<TActual>(TestDelegate code) where TActual : Exception 

Beachten Sie, dass es dauert ein TestDelegate, kein Objekt. TestDelegate ist nur eine Leere Delegierter,

public delegate void TestDelegate(); 

Sie Ihren Code lesen, als ob Sie in einem StreamReader sind vorbei, aber Sie sind vorbei tatsächlich in einem Delegierten, oder mit anderen Worten ein Verfahren, das NUnit aufruft. NUnit weiß nicht, was Sie bei dieser Methode tun. Wie bei jeder anderen Methode liegt es an Ihnen, die von Ihnen erstellten Objekte zu entsorgen.

+0

Ich habe als Reaktion nicht viel zu sagen. Ihre Antwort macht voll und ganz Sinn. Danke für die Antwort. – user2338408