MSTest中ConfigurationManager读取ASP.NET Core appsettings值为NULL
问题根因
MSTest 项目运行上下文独立于 ASP.NET Core Web API 主项目,不会自动加载主项目下的appsettings.json文件。直接调用ConfigurationManager读取时,默认仅会从测试项目自身的运行输出目录查找配置文件,找不到目标文件时对应配置值自然返回null。
Web API 项目正常读取配置的运行效果:
MSTest 读取配置返回null的场景:
解决步骤
- 配置文件部署:将Web API项目中的
appsettings.json添加到MSTest测试项目(可以直接复制文件到测试项目,也可以通过添加现有项时选择「添加为链接」关联主项目的配置文件),右键该文件打开属性面板,将复制到输出目录设置为「如果较新则复制」,生成操作选择「内容」,保证编译后配置文件会出现在测试项目的运行目录下。 - 手动构建配置实例:不要直接使用默认的
ConfigurationManager读取,通过ConfigurationBuilder手动指定配置源加载文件,测试方法内参考代码如下:
using Microsoft.Extensions.Configuration; // 初始化配置构建器 var configuration = new ConfigurationBuilder() // 将基础路径设置为测试程序的当前运行目录 .SetBasePath(Directory.GetCurrentDirectory()) // 加载appsettings.json文件,文件不存在时直接抛错方便排查 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); // 读取配置值,层级配置用冒号分隔节点名 var targetValue = configuration["YourConfigKey"]; var connectionString = configuration.GetConnectionString("DefaultConnection");
- (可选)全局复用配置实例:如果多个测试方法都需要读取配置,不用每个方法重复初始化,通过测试程序集初始化逻辑统一加载一次即可:
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.Extensions.Configuration; [TestClass] public class AssemblyGlobalInit { public static IConfiguration AppConfig { get; private set; } [AssemblyInitialize] public static void Init(TestContext testContext) { AppConfig = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 如果需要加载环境相关配置,追加这行即可,环境变量可以在测试项目调试配置里设置 // .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true) .Build(); } } // 所有测试方法中直接通过 AssemblyGlobalInit.AppConfig 读取配置即可
常见踩坑
- 提前给MSTest项目安装
Microsoft.Extensions.Configuration.JsonNuGet包,否则找不到AddJsonFile扩展方法。- 不要手动拼接配置文件路径,必须通过
SetBasePath(Directory.GetCurrentDirectory())指定运行目录为基础路径,不同测试运行器的工作目录可能存在差异,手动拼接路径容易出现找不到文件的问题。- 如果配置值是存放在子节点下,读取时记得用冒号分隔层级,比如
Logging:LogLevel:Default对应appsettings里Logging节点下LogLevel下的Default值。
内容的提问来源于stack exchange,提问作者Levan Amashukeli
相关产品推荐
相关产品推荐

