Por que configurar Log em um DataContext causa uma ObjectDisposedException?
-
15-11-2019 - |
Pergunta
Esta é minha classe de serviço:
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;
}
}
Esta é minha aula de teste
[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.
}
}
Correndo CanGetSomething
e CanGetSomethingElse
separadamente, usar o executor de teste ReSharper 5 funciona bem, ambos os testes são aprovados.No entanto, tentar executar os testes em sucessão executando a classe inteira faz com que o primeiro método seja aprovado e o segundo método lance a exceção
System.ObjectDisposedException:Não é possível gravar em um TextWriter fechado.
Não parece importar qual método eu chamo no segundo teste, qualquer coisa que chame _db
causará o erro.Comentando _db.Log = Console.Error
elimina a exceção e funcionará bem.
Gostaria de poder registrar o erro e executar uma classe inteira de testes de uma só vez, mas não consigo entender por que ele está se comportando assim.
Alguma ideia?
Solução
Não compartilhe membros da sua turma de teste!Não sabendo o resharper, mas o VS 2010 UnitTesting está realmente interessado em limpar depois de executar um teste.Minha suposição sobre o que acontece aqui é que, ao construir seu TestClass, seu contexto está sendo inicializado.E depois de executar um único teste.O Resharper limpa os recursos, descartando também o seu contexto.
Use um TestInitialize para criar uma nova instância do seu dataContext, isolando assim seus testes uns dos outros