前言
在跑 ABP 的測試專案時,卻發現居然會跑到 Domain 專案的那些 DataSeedContributor
類別的 SeedAsync
Method?
另外,有些 AppService 需要 appsettings
設定值,在 ABP 測試專案中要如何處理呢?
解法
跑測試專案時,會跑到 Domain 專案的那些 DataSeedContributor
類別的 SeedAsync
Method
ABP 的 TestBase
專案中 TestBaseModule
類別中的 OnApplicationInitialization
Method ,會執行 SeedTestData(context);
。
而 SeedTestData(context);
會呼叫 DataSeeder
的 SeedAsync
Method。
在 ABP 系統建立的 DataSeedContributor 會跑 2 次 SeedAsync,導致發生 DB duplicate key 的錯誤? 可以知道,DataSeeder
的 SeedAsync
Method 會取得 組件中所有的 DataSeedContributor
類別,
並呼叫它們的 SeedAsync
Method。
所以這也就導致在執行測試專案時,會一起跑 Domain 專案的那些 DataSeedContributor
類別的 SeedAsync
Method。
那怎麼辦呢?
跟 ABP 系統建立的 DataSeedContributor 會跑 2 次 SeedAsync,導致發生 DB duplicate key 的錯誤? 類似,
將 AbpDataSeedOptions
的 Contributors
移除 Domain 專案的那些 DataSeedContributor
類別就可以了。
所以修改 TestBaseModule
類別中 SeedTestData
Method,如下,
1 | private static void SeedTestData(ApplicationInitializationContext context) |
需要 appsettings
設定值
測試中,有些類別需要 appsettings
設定值怎麼辦呢?
可以參考 ABP.IO WEB 應用程式框架 UnitTest 讀取 appsettings.json ,
在 TestBase
專案中加入 appsettings.test.json
並設定 複製到輸出目錄 為 有更新時才複製
。appsettings.test.json
的內容則是那些類別所需要的一些設定值。
然後在 TestBaseModule
類別的 ConfigureServices
Method 中,
讀取 appsettings.test.json
,並設定為 Singleton Service,如下,
1 | public override void ConfigureServices(ServiceConfigurationContext context) |
參考資訊
Accessing Configuration in .NET Core Test Projects
ABP.IO WEB 應用程式框架 UnitTest 讀取 appsettings.json
ABP 系統建立的 DataSeedContributor 會跑 2 次 SeedAsync,導致發生 DB duplicate key 的錯誤?