2011-05-18 60 views
0

這是我的服務類:爲什麼設置登錄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

不要共享您的測試課程的成員!不知道resharper,但VS 2010 UnitTesting真的可以在運行測試後清理乾淨。我對這裏發生的事情的假設是構建你的TestClass時,你的上下文正在被初始化。並在運行一個單一的測試後。 Resharper清理資源,因此也處理你的上下文。

使用TestInitialize創建一個新的DataContext實例,因此隔離您的測試彼此

+0

Thanks @Polity。你說得對,服務構造函數創建上下文。在TestInitialize中創建服務工作。 – Brandon 2011-05-18 16:10:04

相關問題