Warum verursacht das Festlegen eines Protokolls für einen Datenkontext eine ObjectDisposedException ?
-
15-11-2019 - |
Frage
Das ist meine Serviceklasse:
public class MyService
{
private readonly MyDataContext _db;
public MyService()
{
_db = new MyDataContext(GetConnectionString());
#if DEBUG
_db.Log = Console.Error;
#endif
}
public void Get(int id)
{
return from item in _db.Items
where item.Id == id
select item;
}
}
Das ist meine Testklasse
[TestClass]
public class MyServiceTest
{
private MyService _service = new MyService();
[TestMethod]
public void CanGetSomething()
{
var something = _service.Get(1).ToList();
// Asserts
}
[TestMethod]
public void CanGetSomethingElse()
{
var somethingElse = _service.Get(2).ToList();
// Commented out everything else.
}
}
Laufen CanGetSomething
und CanGetSomethingElse
die separate Verwendung des ReSharper 5-Testläufers funktioniert einwandfrei, beide Tests bestehen.Wenn Sie jedoch versuchen, die Tests nacheinander auszuführen, indem Sie die gesamte Klasse ausführen, wird die erste Methode bestanden und die zweite Methode löst die Ausnahme aus
System.ObjectDisposedException:Kann nicht in einen geschlossenen TextWriter schreiben.
Es scheint egal zu sein, welche Methode ich im zweiten Test aufrufe, alles, was aufruft _db
wird den Fehler verursachen.Auskommentieren _db.Log = Console.Error
beseitigt die Ausnahme und es wird gut funktionieren.
Ich würde gerne in der Lage sein, den Fehler zu protokollieren und eine ganze Klasse von Tests gleichzeitig auszuführen, aber ich kann nicht herausfinden, warum es sich so verhält.
Irgendwelche Ideen?
Lösung
Teile keine Mitglieder deiner Testklasse!Ich kenne Resharper nicht, aber VS 2010 UnitTesting ist wirklich sehr daran interessiert, nach dem Ausführen eines Tests aufzuräumen.Meine Annahme für das, was hier passiert, ist, dass beim Erstellen Ihrer Testklasse Ihr Kontext initialisiert wird.Und nach einem einzigen Test.Resharper bereinigt die Ressourcen und entsorgt daher auch Ihren Kontext.
Verwenden Sie eine TestInitialize, um eine neue Instanz Ihres Datenkontexts zu erstellen und so Ihre Tests voneinander zu isolieren