2011-05-18 5 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; 
    } 
} 

これは私のテストクラスを別々のReSharper 5テストランナーが正常に動作し使用してCanGetSomethingCanGetSomethingElseを実行

[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. 
    } 
} 

で、両方のテストに合格します。しかし、クラス全体を実行することにより、連続してテストを実行しようとすると、例外に

System.ObjectDisposedExceptionをスローするように渡すための第1の方法と第2の方法を発生します閉じたTextWriterに書き込めません。

2番目のテストでどのメソッドを呼び出すかは関係ありません。_dbを呼び出すものはエラーの原因になります。 _db.Log = Console.Errorをコメントアウトすると、例外が取り除かれ、正常に動作します。

エラーをログに記録して、一度にすべてのクラスのテストを実行できるようにしたいのですが、なぜこのように動作しているのかわかりません。

アイデア?

答えて

1

あなたのテストクラスのメンバーを共有できません! resharperは分かっていませんが、VS 2010 UnitTestingは実際にテストを実行した後のクリーンアップに精通しています。ここで何が起こるかについての私の前提は、あなたのコンテキストが初期化されているあなたのTestClassを構築するときです。そして、単一のテストを実行した後。 Resharperはリソースをクリーンアップし、コンテキストを破棄します。

TestInitializeを使用してdataContextの新しいインスタンスを作成し、テストを互いに隔離します。

+0

ありがとう@Polityあなたが正しく、サービスコンストラクタはコンテキストを作成します。 TestInitializeでサービスを作成することができました。 – Brandon