質問
この「コンテキスト外」テストの影響をロールバックできるように、トランザクションスコープの接続を指定する方法はありますか?
バックグラウンド
RestSharp を使用して WebAPI コントローラーをテストしています。これは統合テストであり、リクエストを API に送信することによってテストを行います。このリクエストは、リポジトリとサービス レイヤーを介してデータ レイヤーに至るまで伝播します。つまり、これは意図的に単体テストではありません。
このテストは、restClient のインスタンスを作成します。
[TestInitialize()]
public virtual void TestInitialize()
{
_client = new RestClient("http://localhost:24144");
_client.CookieContainer = new System.Net.CookieContainer();
}
次にクライアントは、データ コンテキストをまったく知らずに (これもまた意図的に) いくつかの要求を行います。
// pseudocode
_client.DoThis();
_client.DoThat();
このテストは、EF コード ファーストの移行から生成されたテスト データベースに対して実行されます。空のシード メソッドがあるため、データベースは空です。
protected override void Seed(TestAppDbContext context)
{
SqlConnection.ClearAllPools();
context.Database.Delete();
context.Database.CreateIfNotExists();
}
問題
これは、実行したい多くのテストの 1 つにすぎません。現在、テスト間でデータベースをドロップ/再作成し、他のテストの後に Api テストが実行されるようにする必要があります。それはデータ コンテキストについて何も知らないので、すべてのテスト コードをトランザクションにラップしてロールバックすることはできません (またはその方法を理解できませんでした)。
私が試したこと
- TestInitialize で transactionscope を新規作成し、TestCleanup で破棄します。これは何もしません。
- このテストの後に「update-database」を実行していますが、ClearAllPools() への呼び出しにもかかわらず、「現在使用中のため、データベースを削除できません」というメッセージが常に表示されます。これは私が注目したい問題ではありませんが、言及する価値があると思いました。