Почему настройка журнала для DataContext вызывает исключение ObjectDisposedException?

#c# #datacontext #objectdisposedexception

#c# #datacontext #исключение objectdisposedexception

Вопрос:

Это мой класс обслуживания:

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

Это мой тестовый класс

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

Запуск CanGetSomething и CanGetSomethingElse раздельное использование тестового модуля ReSharper 5 работают нормально, оба теста пройдены. Однако попытка выполнить тесты последовательно, запустив весь класс, приводит к тому, что первый метод проходит, а второй метод выдает исключение

Система.Исключение ObjectDisposedException: не удается выполнить запись в закрытый TextWriter.

Кажется, не имеет значения, какой метод я вызываю во втором тесте, все, что вызывается _db , вызовет ошибку. Комментирование _db.Log = Console.Error устраняет исключение, и оно будет работать нормально.

Я хотел бы иметь возможность регистрировать ошибку и запускать весь класс тестов одновременно, но я не могу понять, почему он ведет себя подобным образом.

Есть идеи?

Ответ №1:

Не предоставляйте общий доступ к членам вашего тестового класса! Не зная resharper, но модульное тестирование VS 2010 действительно нацелено на очистку после запуска теста. Мое предположение о том, что здесь происходит, заключается в том, что при создании вашего тестового класса инициализируется ваш контекст. И после запуска одного теста. Resharper очищает ресурсы, следовательно, также удаляет ваш контекст.

Используйте TestInitialize для создания нового экземпляра вашего DataContext, таким образом изолируя ваши тесты друг от друга

Комментарии:

1. Спасибо @Polity. Вы были правы, конструктор service создает контекст. Создание службы в TestInitialize сработало.