为什么设置“在数据上下文上登录”会导致 ObjectDisposedException
本文关键字:ObjectDisposedException 登录 设置 数据 上下文 为什么 | 更新日期: 2023-09-27 17:56:43
这是我的服务类:
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 测试运行器分别运行CanGetSomething
和CanGetSomethingElse
工作正常,两个测试都通过。但是,尝试通过运行整个类来连续运行测试会导致第一个方法通过,第二个方法引发异常
System.ObjectDisposedException:无法写入已关闭的 TextWriter。
我在第二个测试中调用什么方法似乎并不重要,任何调用_db
的方法都会导致错误。注释掉_db.Log = Console.Error
可以摆脱异常,它将正常工作。
我希望能够记录错误并一次运行一整类测试,但我无法弄清楚为什么它会这样。
有什么想法吗?
不要分享测试类的成员!不知道锐化器,但VS 2010 UnitTest真的很热衷于在运行测试后进行清理。我对这里发生的事情的假设是,在构造TestClass时,您的上下文正在初始化。并在运行单个测试后。Resharper 会清理资源,因此也会处理您的上下文。
使用 TestInitialize 创建 dataContext 的新实例,从而将测试彼此隔离