1

リポジトリの動作を検証するための統合テストを作成しています。私が遭遇した問題は、すべてのテストでクリーンなデータベースから始めたいということです。私は次のようにSetUpを書くことによってそれを行うことができました:

    [SetUp]
    public void SetUp()
    {
        _applicationContext = new TestApplicationContext();

        _applicationContext.Database.Connection.Close();
        _applicationContext.Database.Delete();
        _applicationContext.Database.Create();

        _tenantRepository = new TenantRepository(_applicationContext);
        _userRepository = new UserRepository(_applicationContext);
    }

TestApplicationContextデータベース名をに設定しますTestDatabase

テストの結果について実際のデータベースを確認するまで、これは正常に機能します。次に、MSSQLサーバーから同じデータベースに接続します。このデータベースは、次のいずれかになるまで閉じられません。

  • MSSQLサーバーをシャットダウンします
  • 「すべての接続を閉じる」オプションを使用してデータベースを削除します

私が見つけた唯一の方法は、SQLコマンドを使用することです。MSSQLに関するn00bの知識が原因かもしれませんが、「接続を閉じる」ボタン/オプションを期待していました。

MSSQLサーバーからデータベースへの接続を閉じるにはどうすればよいですか?または、C#からプログラムでこれを行う方法はありますか?

アップデート:

多分私はあまり明確ではありませんでした。しかし、MSSQLを開いてテーブルの内容を表示した後、テストSetUpは失敗します。これは、MSSQLもTestDatabaseへの接続を作成し、統合テストでその接続を閉じることができないためです。そのため、MSSQLサーバーから作成した接続を閉じることができるソリューションを探しています。

4

3 に答える 3

2

接続を実際に閉じるのではなく、接続プールに解放します。テストごとにデータベースを作成/削除する代わりに、セットアップで新しいトランザクションを開始し、クリーンアップでロールバックします。このように、データベースに変更がコミットされることはなく、テストは常にクリーンな状態から開始されます。

また、ライブデータベースに対してテストしているため、テストを「単体テスト」とは呼びません。単体テストには外部依存関係はありません。

于 2013-01-20T18:52:53.487 に答える
2

データベース全体を削除して再作成する代わりに、選択した(またはすべてのテーブル)を削除して再作成するだけで、接続の問題を回避できます。

テーブル名をハードコーディングする必要がない方法でそれを実行する小さなスクリプトを作成できます:http: //www.apexure.com/blog/2010/07/29/delete-all-tables- in-sql-server-database /

あるいは、JuliaLermanの著書「ProgrammingEntityFramework:Code First」で、カスタムデータベース初期化子として組み込まれているこのアプローチをより成熟した形で言及しています。

独自のカスタム初期化子を作成するだけでなく、他の人が作成した初期化子を見つけることもできます。この一例は、EFCodeFirst.CreateTablesOnlyNuGetパッケージで利用できます。この初期化子を使用すると、実際のデータベース自体を削除して作成するのではなく、既存のデータベースにテーブルを削除して作成できます。これは、データベース全体を削除または作成する権限がないホストされたデータベースを対象としている場合に特に役立ちます。

于 2013-01-20T19:58:35.417 に答える
0

データベースの排他ロックを確実に取得する唯一の方法は、このSINGLE_USER WITH ROLLBACK IMMEDIATE手法を使用することです。空の状態でデータベーススナップショットを作成し、毎回そのスナップショットに復元することをお勧めします。それははるかに高速になります。

于 2013-01-20T20:23:57.740 に答える