Warum verursacht das Festlegen eines Protokolls für einen Datenkontext eine ObjectDisposedException ?

StackOverflow https://stackoverflow.com/questions/6046904

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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top