質問: new TestServer(TestServer.CreateBuilder() .UseStartup()); ``` `Startup`あり、参照だ`Startup` Webアプリケーションプロジェクトから。その`Startup`クラスの`ConfigureServices`メソッドでは、次のようにEFを追加し`Startup` 。 ``` services.AddEntityFramework() .AddSqlServer() .AddDbContext(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); ``` `DbContext`をサービスの`DbContext`戻し、 `Startup`クラスに静的参照を格納することもでき`Startup`が、それはかなりハッキリです。 `TestServer`を作成した`DbContext`をインスタンス化する方法はあり`Startup`か?また、 `Startup`クラスの代わりにWebアプリケーションを使用する方法があり`Startup`か? 編集:私は`TestServer`を作成し、各テストの前にデータベースを削除して再作成するためにそのコンテキストを使用して`DbContext`別のインスタンスをインスタンス化しようとしましたが、各テストの実行時間に約10秒を追加します。
回答: いくつかのアドバイス:最も簡単なアプローチは、最後にテストデータベースを破壊し、各テストの実行ごとに再作成することです。これにより、テスト間の汚染が残っていないことが保証されます。 しかし、どのように尋ねられたので、これはXunitを拡張することで可能です。 Xunitでは、カスタムテストケースとテストランナーを定義することができます。完全な答えはSO答えに含めるのは難しいです。最も簡単なソリューションは、周囲トランザクションを使用します。 Xenitには、トランザクションをロールバックするカスタムのBeforeAfterTestAttributeのサンプルがあります(危険です!周囲のトランザクションは扱いにくいかもしれません)。 。アンビエントトランザクションを使用するには、アンビエントトランザクションが存在する場合にスローされるデフォルトのEF設定をオフにします( `optionsBuilder.UseSqlServer().SuppressAmbientTransactionWarning()` )。 より複雑な、より良い解決策は、 `XunitTestCaseRunner`をオーバーライドして各テストケースにトランザクションを注入し、各テストの最後にロールバックすることです。 また、EFドキュメントでは、InMemoryプロバイダを使用してテストするサンプルを提供しています。これは便利です。 "メモリ内テスト:EF Core Docs"