筆記 Module IConfiguration 讀不到 appsettings.json 的處理方式
以 Configure AddHttpClient<IClient,TImplementation> 為例
結論
- MyProject.TestBase 專案內新增
appsettings.test.json
並將屬性改成 內容/永遠複製 - MyProjectTestBaseModule.cs 加上
BuildConfiguration
方法來取得configuration
- HttpClient 介面註冊
AddHttpClient<TClient,TImplementation>(Action<HttpClient>)
- 統一將需要 appsettings 的服務註冊在 HttpApiHostModule,因為測試時不會用到該模組,所以不會發生例外
然後統一於 TestBaseModule 來註冊測試方法所需的服務 (使用第一點與第二點進行 appsettings 讀取)
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.test.json", optional: false);
return builder.Build();
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
ConfigureBackgroundJob();
context.Services.AddAlwaysAllowAuthorization();
// Add
var configuration = BuildConfiguration();
ConfigureHttpClient(context, configuration);
ConfigureMyOptions(configuration);
}
private void ConfigureHttpClient(ServiceConfigurationContext context,
IConfiguration configuration)
{
context.Services.AddHttpClient<IMyServiceProxy,MyServiceProxy>(opt =>
{
if (Uri.TryCreate(configuration["MyService:URL"],
UriKind.Absolute, out var uri))
{
opt.BaseAddress = uri;
}
});
}
private void ConfigureMyOptions(IConfiguration configuration)
{
Configure<MyOptions>(options =>
{
options.Path = configuration["MyOptions:Path"];
});
}
問題
- 單元測試裡面並沒有 appsetting.json 相關機制
導致有些用到該設定檔的地方測試會取不到值 - Typed HttpClient 官方教學不是用介面
所以要用 Interface 需要在註冊服務的時候指定AddHttpClient<TClient,TImplementation>(Action<HttpClient>)
- DomainModule, EntityFrameworkCoreModule, ApplicationModule
src 內的上述模組內只要用到 appsettings 都會取不到值
因此有可能會在需要該值進行設定時發生 null 例外
參考
[ .NET Core ] - 使用 Typed client 打造具有 IntelliSense 的 HttpClient | 工程良田的小球場 - 點部落 (dotblogs.com.tw)
abp/TodoDbContextFactory.cs at dev · abpframework/abp (github.com)
Accessing Configuration in .NET Core Test Projects - Rick Strahl's Web Log (west-wind.com)