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.
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. –
@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
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