簡體   English   中英

試圖使代碼遷移在specflow和ef6中的方案級別上起作用

[英]Trying to get code migrations to work at scenario level in specflow and ef6

因此,我嘗試使用實體框架6在specflow中進行一些端到端測試。

我啟用了代碼遷移,並編寫了seed方法。 我有一個上下文工廠,可以使用受步驟定義影響的連接字符串來生成上下文。

我想要做的是在功能中,我要創建一個如下的背景步驟

Given I create a database "Admin-Test"

在此測試中,我希望刪除與數據庫的所有連接,然后刪除它,然后依靠EF6代碼遷移,然后重新創建它並使用一組已知的數據(應用程序的默認數據)播種。

對於特性中的第一種情況,這一切都很好用,但是對於其余的(當刪除數據庫時),代碼遷移不會運行以重新填充它。

我試過從DropCreateDatabaseAlways<DbContext>繼承,並且這在第一個而不是隨后的中被命中。

我遇到的第一個問題是未創建數據庫,如果我手動執行該操作,則種子材料仍未運行(我在msdn上讀到一些有關ef不再創建db的信息,因為它使用戶感到困惑)。

所以我的問題是:如何獲得每種情況下觸發的代碼遷移? 我懷疑人們可能會更容易回答的問題是:如何在單元測試中手動觸發自動代碼遷移內容以使其運行?

額外的問題是:在每種情況下重新創建數據庫都是效率低下的-我注意到遷移會產生大量的數據庫上下方法。 如何手動運行這些代碼,然后運行種子代碼?

我個人認為您的獎金問題是潛在整體方法的一部分。 我不明白為什么SEEDMigration需要如此緊密地結合在一起。

與多個數據庫一起使用的基本模式。

a)默認情況下,對沒有初始化程序的數據庫使用上下文

 Database.SetInitializer(new ContextInitializerNone<MYDbContext>());
 var context = new MYDbContext((Tools.GetDbConnection(DataSource,DbName )),true); // pass in connection to db

b)按需遷移。 對我來說,這意味着行政觸發

 public override void MigrateDb() { 
   Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, MyMigrationConfiguration>());
   Context.Database.Initialize(true);
    }

c)單獨的Control Drops-管理員觸發器您可以為此使用EF。 我個人更喜歡從代碼觸發的SQL腳本。

d)觸發種子例程-管理員觸發。 例如,使用可以通過僅稱為Migrate的工具調用的常規程序。 我不喜歡嘗試從EF遷移內部啟動它。 對我來說,在調用種子時導致EF編排令人頭疼。

當然,一個管理步驟可以根據需要合並。

我使用自定義構建的遷移工作台(WPF),該工作台可以在任何數據庫上執行上述任何或所有操作。 包括新的數據庫。

我使用的一種方法是聲明[BeforeScenario]方法並在此處創建數據庫並運行遷移,然后在[AfterScenario]方法中刪除數據庫。 通常最好將它們放在單獨的類中以進行設置。 只要將其標記為[Binding]類,specflow就會找到它並運行方法。

[BeforeScenario]我通過db上下文( ApplicationDB )創建,然后創建數據庫

container = TestContainerFactory.SetupContainer(id);
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDb, Configuration>());
var applicationDb = container.GetInstance<ApplicationDb>();    
if (applicationDb.Database.Exists()) //just in case the previous test didn't delete the old db
{
    applicationDb.Database.Delete();
}
applicationDb.Database.Initialize(true);

[AfterScenario]刪除數據庫

var applicationDb = container.GetInstance<ApplicationDb>();
applicationDb.Database.Delete();
applicationDb.Dispose();

我遇到的唯一問題是當我使用像NCrunch這樣的多線程測試運行程序運行它時,必須確保為每種情況創建和刪除一個新數據庫,並且這些數據庫都具有唯一的名稱,我使用GUID生成。

這對我有用了一段時間,直到有太多的測試使反饋周期變得太長為止,那時我允許測試通過在IDbSet東西的IQueryable接口后面的內存集合中模擬數據庫。 我在配置中將此開關設置為可切換,以便在NCrunch運行它們的大部分時間里可以快速運行測試,然后將開關切換回針對數據庫實際運行它們,以檢查這些東西是否仍在正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM