2016-02-16 59 views
2

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

下面是如何創建TestServer

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

多數民衆贊成引用的有來自Web應用程序項目StartupStartup。在該Startup類的ConfigureServices方法我加EF這樣的:

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

我可以拉服務DbContext背部和存儲在Startup類的靜態引用,但似乎很哈克。有什麼辦法可以實例化DbContext我創建TestServer並以某種方式讓web應用程序使用該應用程序而不是Startup類中的應用程序?

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

回答

1

一些建議:最簡單的方法是在最後銷燬測試數據庫併爲每次測試運行重新創建。這確保了沒有揮之不去的測試對測試污染。

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

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

另外,EF文檔提供了使用InMemory提供程序進行測試的示例。你可能會覺得這很有用。 "Testing In Memory : EF Core Docs"

相關問題