0

これは私のサービスクラスです:

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ただし、クラス全体を実行してテストを連続して実行しようとすると、最初のメソッドが合格し、2番目のメソッドが例外をスローします。

System.ObjectDisposedException:閉じたTextWriterに書き込めません。

2番目のテストでどのメソッドを呼び出すかは問題ではないようです。呼び出す_dbと、エラーが発生します。コメントアウトする_db.Log = Console.Errorと例外がなくなり、正常に機能します。

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

何か案は?

4

1 に答える 1

1

テストクラスのメンバーを共有しないでください!resharperについてはわかりませんが、VS 2010 UnitTestingは、テストの実行後のクリーンアップに非常に役立ちます。ここで何が起こるかについての私の仮定は、TestClassを構築するときに、コンテキストが初期化されているということです。そして、単一のテストを実行した後。Resharperはリソースをクリーンアップするため、コンテキストも破棄します。

TestInitializeを使用して、dataContextの新しいインスタンスを作成します。これにより、テストを相互に分離します。

于 2011-05-18T15:27:34.880 に答える