データベーストランザクションでTestServerを使用する統合テストをラップするにはどうすればよいですか?

entity-framework-core xunit

質問

Microsoft.AspNet.TestHostのxUnitとTestServerを使用して、テスト後にロールバックできるデータベーストランザクションで各テストをラップする方法はありますか?

TestServer作成方法はTestServerとおりTestServer

TestServer = new TestServer(TestServer.CreateBuilder()
    .UseStartup<Startup>());

Startupあり、参照だStartup Webアプリケーションプロジェクトから。そのStartupクラスのConfigureServicesメソッドでは、次のようにEFを追加しStartup

services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<TrailsDbContext>(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のサンプルがあります(危険です!周囲のトランザクションは扱いにくいかもしれません)。 https://github.com/xunit/samples.xunit/tree/master/AutoRollbackExample 。アンビエントトランザクションを使用するには、アンビエントトランザクションが存在する場合にスローされるデフォルトのEF設定をオフにします( optionsBuilder.UseSqlServer().SuppressAmbientTransactionWarning() )。

より複雑な、より良い解決策は、 XunitTestCaseRunnerをオーバーライドして各テストケースにトランザクションを注入し、各テストの最後にロールバックすることです。

また、EFドキュメントでは、InMemoryプロバイダを使用してテストするサンプルを提供しています。これは便利です。 "メモリ内テスト:EF Core Docs"



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ