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

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

Вопрос

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

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 test runner работает нормально, оба теста проходят успешно.Однако попытка выполнить тесты последовательно, запустив весь класс, приводит к тому, что первый метод проходит, а второй метод генерирует исключение

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

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

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

Есть какие-нибудь идеи?

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top