为什么在DataContext上设置Log会导致ObjectDisposedException?

时间:2011-05-18 15:04:13

标签: 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.
  }
}

使用ReSharper 5测试运行器单独运行CanGetSomethingCanGetSomethingElse工作正常,两个测试都通过。但是,尝试通过运行整个类来连续运行测试会导致第一个方法通过,第二个方法抛出异常

  

System.ObjectDisposedException:无法写入已关闭的TextWriter。

在第二次测试中我调用的方法似乎并不重要,调用_db的任何内容都会导致错误。注释掉_db.Log = Console.Error可以摆脱异常,它可以正常工作。

我希望能够记录错误并立即运行整个测试类,但我无法弄清楚为什么它会像这样。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不要分享您的测试类的成员!不知道resharper,但VS 2010 UnitTesting真的非常希望在运行测试后进行清理。我对这里发生的事情的假设是在构造TestClass时,正在初始化您的上下文。并且在运行单个测试之后。 Resharper清理资源,因此也处理你的上下文。

使用TestInitialize创建dataContext的新实例,从而将测试彼此隔离