ASP.NET Core 2集成测试读取appsettings.json无值问题求助
兄弟,我之前也踩过类似的坑,给你梳理下解决方案,先澄清一个关键认知:你找不到project.json是完全正常的——.NET Core 2.0已经彻底抛弃了project.json格式,改用*.csproj文件管理项目配置,所以不用再纠结它啦。
接下来针对你遇到的两个核心问题逐一解决:
1. 工作目录指向集成测试的bin目录而非WebApi项目目录
集成测试项目默认会把自身的输出目录(也就是你看到的./IntegrationTests/bin/Debug/netcoreapp2.0)作为工作目录,这就是root变量路径不符合预期的原因。有两种解决方式:
方法一:通过Visual Studio可视化设置调整
右键你的集成测试项目 → 属性 → 切换到调试标签页 → 在工作目录栏中,设置为你的WebApi项目根目录(比如$(SolutionDir)\YourWebApiProjectName)。这样测试运行时就会自动以WebApi的目录作为当前工作目录。
方法二:通过代码动态指定
在测试类的初始化逻辑里(比如xUnit的IClassFixture初始化、NUnit的[SetUp]方法),手动设置当前工作目录:
// 假设WebApi项目在集成测试项目的上两级目录下,根据你的实际路径调整层级 var webApiRootPath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../YourWebApiProjectName")); Directory.SetCurrentDirectory(webApiRootPath);
2. IConfiguration读取自定义数据为空
这个问题大概率是测试项目没正确加载WebApi的appsettings.json,或者加载了测试项目自身的配置文件(如果存在的话)。按以下步骤修复:
步骤1:明确加载WebApi的配置文件
在测试项目的配置初始化代码中,结合上面设置的正确工作目录,指定加载WebApi的配置文件:
var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) // 这里已经是WebApi的根目录 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 如果有环境专属配置文件,比如appsettings.Development.json,也可以加上 .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true) .Build();
步骤2:验证键名与读取方式
- 检查
appsettings.json里的自定义数据键名是否和代码中读取的一致,比如配置是:
读取时要用{ "FolderName": "MyTargetFolder" }configuration["FolderName"];更推荐用强类型绑定,避免字符串写错:public class AppSettings { public string FolderName { get; set; } } // 绑定到类 var appSettings = configuration.Get<AppSettings>(); // 此时appSettings.FolderName就能正确获取值
步骤3:确保配置文件可访问(可选)
如果没把工作目录设为WebApi根目录,想从测试输出目录读取的话,需要右键WebApi项目中的appsettings.json → 属性 → 设置复制到输出目录为如果较新则复制或始终复制,确保文件能被测试项目访问到。
内容的提问来源于stack exchange,提问作者cortisol

