.NET Core 5 Web API使用Xunit测试无法读取appsettings.Development.json问题
问题根因及解决方案
核心原因
- 配置文件路径不匹配:
WebHostBuilder默认会将测试项目的输出目录作为内容根目录,而appsettings.Development.json通常存放在Web API主项目的根目录,不在测试项目的运行路径下,自然无法读取。 - 文件复制属性未配置:即使你把配置文件拷贝到测试项目目录下,如果没有把文件的「复制到输出目录」属性设置为「如果较新则复制/始终复制」,项目生成时不会把配置文件输出到运行目录,也会读取失败。
- 未显式指定配置加载规则:你当前使用的
WebHostBuilder默认只会扫描当前内容根目录下的配置文件,没有额外指定读取主项目配置的逻辑,也会导致加载失败。
可用解决方案
方案1:显式指定主API项目的内容根路径
直接在构造TestServer时指定内容根为Web API主项目的路径,修改代码如下:
public ContestTest() { // 路径根据测试项目和主API项目的相对位置调整,示例为主项目存放在CorporateMembership.Api文件夹的场景 var apiProjectPath = Path.Combine(Directory.GetCurrentDirectory(), "../../../../CorporateMembership.Api"); var server = new TestServer(new WebHostBuilder() .UseContentRoot(apiProjectPath) .UseEnvironment("Development") .UseStartup<Startup>()); _httpClient = server.CreateClient(); }
方案2:给测试项目添加配置文件链接
不想硬编码路径可以用链接方式关联主项目的配置文件:
- 右键测试项目 → 选择添加 → 现有项
- 找到主API项目下的
appsettings.json、appsettings.Development.json - 点击添加按钮旁的下拉箭头,选择「添加为链接」
- 选中这两个新增的链接文件,在属性面板把「复制到输出目录」设为「如果较新则复制」
方案3:手动指定配置文件加载逻辑
也可以在WebHostBuilder初始化时手动加载对应配置文件:
public ContestTest() { var config = new ConfigurationBuilder() .AddJsonFile("appsettings.Development.json") .AddEnvironmentVariables() .Build(); var server = new TestServer(new WebHostBuilder() .UseConfiguration(config) .UseEnvironment("Development") .UseStartup<Startup>()); _httpClient = server.CreateClient(); }
注意:使用该方案需要先确保配置文件已经被输出到测试项目的运行目录,或者已经配置了正确的内容根路径。
内容的提问来源于stack exchange,提问作者Allan Jhonny
相关产品推荐
相关产品推荐

