私は (他の多くの人と同じように) NUnit テストで[SetUp]
テスト フィクスチャのデータベースを削除できないという問題に直面しています。
達成したいこと
コードをテストし、期待される結果がデータベースに格納されているかどうかを検証する統合テストを作成したいと考えています (CRUD メソッドのアサート)。それと、実際に SqlServer のテーブルを表示して、データベースの結果がどのように見えるかを確認できるようにしたいと考えています。その最後の部分は達成するのが難しいようです...
何がうまくいかないのか
テストを何回も続けて実行できます。データベースは[SetUp]
毎回再作成され、テストはアサートに合格します。SqlServer の実際のデータベースで結果を確認したいと思うとすぐに、それは無駄になります。SqlServer から接続を開くと、接続が開かれているため、[SetUp]
メソッドはデータベースを削除できません。
私は何を試しましたか
- データベース初期化子
- ALTER database SET SINGLE_USER WITH ROLLBACK IMMEDIATE
- Pooling=false が接続文字列に追加されました
これらのアイデアは、thisとthis SO の投稿から取り入れました。
私は何を持っていますか
[SetUp]
メソッド:
[SetUp]
public void SetUp()
{
// TenantSeedInitializer extends the
// DropCreateDatabaseAlways<TenantApplicationTestContext> class
Database.SetInitializer(new TenantSeedInitializer());
_applicationContext = new TenantApplicationTestContext();
_applicationContext.Database.ExecuteSqlCommand("ALTER DATABASE " +
TenantApplicationTestContext.DatabaseName +
" SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
}
[TearDown]
メソッド:
[TearDown]
public void TearDown()
{
SqlConnection.ClearAllPools();
}
そして、かなり簡単なテスト:
[Test]
public void AddTenant()
{
// add a new tenant to the database and verify that there
// there is only one tenant present in the table
}
私が言ったように、このテストを数回続けて実行すると、SqlServer でテーブルを開こうとするところまで、魔法のように機能します。
2つの異なる(私にとっては未解決の)エラーシナリオ
1)ビジュアルスタジオからの接続がまだ開いているため、テーブルを表示できません。
データベース 'TestTenantDatabase' は既に開いており、一度に 1 人のユーザーしか持つことができません。
を追加しSqlConnection.ClearAllPools();
ても解決しないようです。
2)または、SqlServer でテーブルを表示することは許可されていますが、[SetUp]
フィクスチャからデータベースを削除することは許可されていません。
データベース「TestTenantDatabase」は現在使用中のため、削除できません。
これを取り除く唯一の方法は、SqlServer をシャットダウンすることです。しかし、その後、日中にSqlServerを何度も再起動していることに気づきました...(データベースへの接続を閉じるオプションも役立ちますが、見つかりません)。
誰でもこれを案内できますか?