Pourquoi la définition de Log sur un DataContext provoque-t-elle une ObjectDisposedException ?

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

Question

Voici ma classe de service :

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;
  }
}

C'est ma classe de test

[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.
  }
}

En cours d'exécution CanGetSomething et CanGetSomethingElse L'utilisation séparée du lanceur de tests ReSharper 5 fonctionne correctement, les deux tests réussissent.Cependant, si vous essayez d'exécuter les tests successivement en exécutant la classe entière, la première méthode réussit et la seconde méthode lève l'exception.

System.ObjectDisposedException :Impossible d'écrire sur un TextWriter fermé.

La méthode que j'appelle dans le deuxième test ne semble pas avoir d'importance, tout ce qui appelle _db provoquera l'erreur.Commenter _db.Log = Console.Error se débarrasse de l'exception et cela fonctionnera bien.

J'aimerais pouvoir enregistrer l'erreur et exécuter une classe entière de tests à la fois, mais je n'arrive pas à comprendre pourquoi il se comporte ainsi.

Des idées?

Était-ce utile?

La solution

Ne partagez pas les membres de votre classe de test !Je ne connais pas Resharper, mais VS 2010 UnitTesting tient vraiment à nettoyer après avoir exécuté un test.Mon hypothèse sur ce qui se passe ici est que lors de la construction de votre TestClass, votre contexte est en cours d'initialisation.Et après avoir exécuté un seul test.Resharper nettoie les ressources, éliminant ainsi également votre contexte.

Utilisez un TestInitialize pour créer une nouvelle instance de votre dataContext, isolant ainsi vos tests les uns des autres

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top