如何在數據庫事務中包裝使用TestServer的集成測試?

entity-framework-core xunit

使用xUnit和Microsoft.AspNet.TestHost中的TestServer ,如何將每個測試包裝在可以在測試後回滾的數據庫事務中?

這是我創建TestServer

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

Startup多數民眾贊成引用存在Startup從Web應用程序項目。在該Startup類的ConfigureServices方法中,我添加了EF,如下所示:

services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<TrailsDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

我可以將DbContext拉回服務並在Startup類上存儲靜態引用,但這看起來很糟糕。有沒有辦法我可以實例化我創建TestServerDbContext ,並以某種方式讓Web應用程序使用它而不是Startup類中的那個?

編輯:我已經嘗試實例化DbContext另一個實例,我在其中創建TestServer並使用該上下文在每次測試之前刪除並重新創建數據庫,但這會為每個測試的運行時間增加大約10秒。

熱門答案

一些建議:最簡單的方法是在最後銷毀測試數據庫並為每次測試運行重新創建。這確保不會留下持續的測試 - 測試污染。

但是既然你問過怎麼做,可以通過擴展Xunit來完成。 Xunit允許您定義自定義測試用例和測試運行器。一個完整的答案很難包含在SO答案中。最簡單的解決方案使用環境事務。 (危險!環境事務可能很棘手。)Xunit有一個自定義BeforeAfterTestAttribute的示例,用於回滾事務。 https://github.com/xunit/samples.xunit/tree/master/AutoRollbackExample 。要使用環境事務,請關閉存在環境事務時拋出的默認EF設置。( optionsBuilder.UseSqlServer().SuppressAmbientTransactionWarning() )。

更複雜但更好的解決方案是覆蓋XunitTestCaseRunner並將事務注入每個測試用例,確保在每個測試結束時回滾。

此外,EF文檔提供了使用InMemory提供程序進行測試的示例。你可能會覺得這很有用。 “在內存中測試:EF核心文檔”



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因