#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 сработало.