.NET Core集成测试时如何加载被测项目的配置文件
解决.NET Core 2.1集成测试中加载被测项目配置文件的问题
我之前做.NET Core 2.1集成测试时也碰到过一模一样的路径坑,用符号链接确实能临时解决,但确实不够优雅。这里给你几个更合理的解决方案,按需选择:
方案1:手动指定配置基础路径指向被测项目
在创建TestServer时,把配置的基础路径切换到被测项目的根目录,这样AddJsonFile就能精准找到配置文件了:
public PingController_RunShould() { _server = new TestServer(new WebHostBuilder() .ConfigureAppConfiguration((builderContext, config) => { // 解析出被测项目的绝对根路径 var targetProjectRoot = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "../mtss-ws")); // 把配置的基础路径设置为被测项目根目录 config.SetBasePath(targetProjectRoot) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 可选:如果有环境专属配置文件,也一起加载 .AddJsonFile($"appsettings.{builderContext.HostingEnvironment.EnvironmentName}.json", optional: true); }) .UseStartup<Startup>()); _client = _server.CreateClient(); }
Path.GetFullPath能帮你解析相对路径,避免不同运行环境下的路径歧义。
方案2:自动复制被测项目配置到测试输出目录
直接在测试项目的.csproj里加配置,让构建时自动把被测项目的appsettings.json同步到测试项目的bin目录,这样你原来的代码不用改就能正常工作:
打开mtss-ws.integrationtests.csproj,添加以下内容:
<ItemGroup> <!-- 复制主项目的基础配置文件 --> <Content Include="../mtss-ws/appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <!-- 同步所有环境特定的配置文件(比如appsettings.Development.json) --> <Content Include="../mtss-ws/appsettings.*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
这个方案最省心,每次构建测试项目都会自动同步配置,不用操心路径问题。
方案3:使用WebApplicationFactory(官方推荐)
.NET Core 2.1已经引入了WebApplicationFactory,这是官方推荐的集成测试方式,能自动处理很多路径和配置细节,还能灵活定制测试环境:
先创建一个自定义工厂类:
public class MtssWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class { protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureAppConfiguration((context, config) => { var targetProjectRoot = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "../mtss-ws")); config.SetBasePath(targetProjectRoot) .AddJsonFile("appsettings.json", optional: false); }); } }
然后在测试类里用这个工厂创建客户端:
private readonly HttpClient _client; public PingController_RunShould() { var factory = new MtssWebApplicationFactory<Startup>(); _client = factory.CreateClient(); }
这个方案不仅能解决配置问题,还能方便地替换服务、修改环境变量,适合复杂的集成测试场景。
内容的提问来源于stack exchange,提问作者opensas
相关产品推荐
相关产品推荐

