2

私は (他の多くの人と同じように) NUnit テストで[SetUp]テスト フィクスチャのデータベースを削除できないという問題に直面しています。

達成したいこと

コードをテストし、期待される結果がデータベースに格納されているかどうかを検証する統合テストを作成したいと考えています (CRUD メソッドのアサート)。それと、実際に SqlServer のテーブルを表示して、データベースの結果がどのように見えるかを確認できるようにしたいと考えていますその最後の部分は達成するのが難しいようです...

何がうまくいかないのか

テストを何回も続けて実行できます。データベースは[SetUp]毎回再作成され、テストはアサートに合格します。SqlServer の実際のデータベースで結果を確認したいと思うとすぐに、それは無駄になります。SqlServer から接続を開くと、接続が開かれているため、[SetUp]メソッドはデータベースを削除できません。

私は何を試しましたか

  • データベース初期化子
  • ALTER database SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  • Pooling=false が接続文字列に追加されました

これらのアイデアは、thisthis 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を何度も再起動していることに気づきました...(データベースへの接続を閉じるオプションも役立ちますが、見つかりません)。

誰でもこれを案内できますか?

4

1 に答える 1

0

このメッセージ:

データベース 'TestTenantDatabase' は既に開いており、一度に 1 人のユーザーしか持つことができません。

データベースをシングルユーザーに設定したために発生しています。通常、これを行うと、データベースへの他の接続が強制終了され、自分の接続だけがアクセスできるようになります。ただし、データベース コンテキストを変更すると、Visual Studio などの他のアプリケーションが接続してシングル ユーザーになり、実質的にロックアウトされる可能性があります。

セットアップフィクスチャでこれを試してください:

use TestTenantDatabase;
alter database TestTenantDatabase set single_user with rollback immediate;
use master;
drop database TestTenantDatabase;

シングルユーザー設定時にデータベースにいる場合は、シングルユーザーになります。次に、マスターに変更してから同じバッチ内でデータベースを削除すると、接続しようとしている人を打ち負かすはずです。

もう 1 つのオプションは、single_user の代わりにオフラインに設定することですが、その後データベースを削除すると、データベースの .mdf & .ldf (および任意の .ndf) ファイルが削除されないため、別のデータベースの再作成で問題が発生する可能性があります。テストのセット。

single_user の実行中にデッドロックに関連するエラーが発生した場合は、デッドロックの優先度を高く設定してください。接続を再利用する場合は、ドロップ後に通常に戻すことができます。

于 2013-02-24T11:36:51.540 に答える