ASP.NET Core 2中如何在测试中构建IOptions<T>实例?
在ASP.NET Core 2集成测试中获取IOptions实例的正确姿势
我之前也碰到过这个问题,在集成测试里直接用_config.GetSection("MyOptions").Value或者_config.GetValue<MyOptions>("MyOptions")确实拿不到正确的配置对象——这俩方法更适合读取简单键值对,处理复杂配置类就不太灵光了。给你分享个靠谱的解决步骤:
第一步:正确构建测试项目的配置对象
首先得确保测试项目能正确加载到appsettings.json文件,这里需要用ConfigurationBuilder来构建配置,还要注意设置正确的基目录(不然可能找不到配置文件)。代码示例:using Microsoft.Extensions.Configuration; using System.IO; // 构建配置,基目录根据你的测试项目结构调整 var configBuilder = new ConfigurationBuilder() .SetBasePath(Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "../YourTestProjectFolder"))) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); var configuration = configBuilder.Build();另外别忘了把测试项目里的
appsettings.json属性设置为复制到输出目录:如果较新则复制,不然运行测试时会找不到文件。第二步:绑定配置到MyOptions实例
用配置节的Bind方法把配置值绑定到MyOptions对象上,或者也可以用更简洁的Get<T>方法(ASP.NET Core 2.0及以上支持):using Microsoft.Extensions.Options; // 方式1:Bind方法 var myOptions = new MyOptions(); configuration.GetSection("MyOptions").Bind(myOptions); // 方式2:Get<T>方法 var myOptions = configuration.GetSection("MyOptions").Get<MyOptions>();第三步:包装成IOptions
实例
框架提供了Options.Create静态方法,可以把我们的MyOptions实例包装成IOptions<MyOptions>接口对象,这样就能像在Web项目里一样注入到MyService中使用了:var options = Options.Create(myOptions); // 用这个options实例初始化MyService var myService = new MyService(options);
这样操作下来,就能正确从测试项目的appsettings.json里加载配置,得到可用的IOptions<MyOptions>实例啦。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

