Почему установка Log для DataContext вызывает исключение ObjectDisposedException?
-
15-11-2019 - |
Вопрос
Это мой класс обслуживания:
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, таким образом изолируя ваши тесты друг от друга