DataContextのログオンを設定するのは、ObjectDisposedExceptionを原因にしますか?
-
15-11-2019 - |
質問
これは私のサービスクラスです:
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.
}
}
.
CanGetSomething
とCanGetSomethingElse
を別々に使用して、Resharper 5テストランナーがうまく機能し、両方のテストは合格です。ただし、クラス全体を実行してテストを続行しようとすると、最初のメソッドが渡され、2番目のメソッドが例外をスローします。
System.ObjectDisposedException:クローズドテキストライターに書き込めません。
2番目のテストでどのメソッドを呼び出すかは問題ではありません.
_db
を呼び出すものはエラーを引き起こします。_db.Log = Console.Error
をコメントする例外を解消し、それはうまく機能します。エラーを記録して一度にテストのクラス全体を実行できるようにしたいが、それがこのように動作している理由を理解することはできません。
任意のアイデア?
解決
Dont share members of your test class! Not knowing resharper, but VS 2010 UnitTesting is really kean on cleaning up after running a test. My assumption for what happens here is when constructing your TestClass, your context is being initialized. And after running a single test. Resharper cleans up the resources, therefore also disposing your context.
Use a TestInitialize to create a new instance of your dataContext, therefore isolating your tests from one another