C#如何读取HOCON文件映射对象并在集成测试中访问配置
读取解析HOCON文件并映射为C#对象
微软原生IConfiguration体系不直接支持HOCON格式解析,通过官方适配包可以实现和JSON配置完全一致的使用体验,步骤如下:
- 首先在测试项目中安装NuGet包
Hocon.Extensions.Configuration,该包适配了微软配置栈的扩展规范,和主程序使用的配置逻辑完全兼容;如果需要做配置到强类型对象的绑定,额外安装Microsoft.Extensions.Configuration.Binder包即可。 - 构建配置实例加载HOCON文件,提前将测试用的HOCON文件属性设置为「如果较新则复制」到输出目录,避免运行时找不到文件:
using Microsoft.Extensions.Configuration; IConfiguration configuration = new ConfigurationBuilder() // 参数依次为文件路径、文件是否可选、配置变更是否自动重载 .AddHoconFile("appsettings.hocon", optional: false, reloadOnChange: false) // 存在多份配置时可以继续叠加AddHoconFile调用,后加载的配置会覆盖同名键 .AddHoconFile("test.override.hocon", optional: true) .Build();
- 映射为C#强类型对象:先定义和HOCON配置结构匹配的C#类,属性名和配置键名保持一致即可,再通过绑定方法完成映射:
// 示例配置类,结构对应HOCON中的层级 public class AppSettings { public string ServiceAddress { get; set; } public DbSettings Database { get; set; } } public class DbSettings { public string ConnectionString { get; set; } public int CommandTimeout { get; set; } } // 绑定为强类型对象 AppSettings settings = configuration.Get<AppSettings>();
测试项目中访问单例注册的配置
根据测试场景不同,有两种常用实现方式,都和主程序的DI注册逻辑保持一致:
- 非Web类项目直接构建测试用DI容器:和主程序的服务注册逻辑保持一致,将配置注册为单例后构建服务提供者,即可直接获取配置或依赖配置的其他服务:
using Microsoft.Extensions.DependencyInjection; ServiceCollection services = new ServiceCollection(); // 和主程序逻辑一致,将IConfiguration注册为单例 services.AddSingleton<IConfiguration>(configuration); // 注册强类型配置选项 services.Configure<AppSettings>(configuration); // 注册项目中其他依赖配置的业务服务 // services.AddTransient<IMyService, MyService>(); // 构建服务提供者 using ServiceProvider provider = services.BuildServiceProvider(); // 获取配置实例 IConfiguration configFromDi = provider.GetRequiredService<IConfiguration>(); // 获取强类型配置 AppSettings settingsFromDi = provider.GetRequiredService<IOptions<AppSettings>>().Value;
- ASP.NET Core集成测试场景使用
WebApplicationFactory:直接复用主程序的服务注册逻辑,不需要重复编写配置注册代码,如果需要加载测试专用的HOCON配置覆盖生产配置,可以重写Web主机配置逻辑:
// 自定义测试应用工厂 public class TestWebFactory : WebApplicationFactory<Program> { protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureAppConfiguration(configBuilder => { // 追加测试专用HOCON配置,后加载的配置会自动覆盖同名键 configBuilder.AddHoconFile("test.appsettings.hocon", optional: true); }); } }
测试用例中直接从工厂的服务集合中获取配置即可:
[Fact] public void Config_Should_Load_Correctly() { var factory = new TestWebFactory(); using var scope = factory.Services.CreateScope(); var config = scope.ServiceProvider.GetRequiredService<IConfiguration>(); var settings = scope.ServiceProvider.GetRequiredService<IOptions<AppSettings>>().Value; // 编写测试断言逻辑 Assert.NotNull(settings.ServiceAddress); }
注意:测试项目中引用的所有HOCON文件都必须设置「复制到输出目录」属性,否则运行时会抛出文件找不到的异常。
内容的提问来源于stack exchange,提问作者goscamp
相关产品推荐
相关产品推荐

