前言
在跑 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 的錯誤?