You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 7集成测试中Serilog无法读取独立配置文件的问题

在ASP.NET Core 7 Web API集成测试中为Serilog配置独立测试配置文件

问题根源

你之前的代码存在两个核心问题:

  1. Program.cs中单独创建ConfigurationBuilder初始化Serilog,没有复用WebApplicationBuilder的配置体系,导致测试时添加的appsettings.Test.json无法被Serilog读取。
  2. CustomWebApplicationFactory中未清除默认配置源,导致API项目的appsettings.json优先级高于测试配置,同时配置文件路径可能指向错误。

解决方案

1. 重构Program.cs,让Serilog复用WebApplicationBuilder的配置

修改Program.cs,移除手动创建ConfigurationBuilder的逻辑,直接使用WebApplicationBuilder已加载的配置初始化Serilog,这样测试时的配置变更会自动同步给Serilog:

var builder = WebApplication.CreateBuilder(args);

// 让Serilog读取WebApplicationBuilder的内置配置(包含环境对应的配置文件)
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(builder.Configuration)
    .CreateLogger();

Log.Information($"Starting {typeof(Program).Assembly.FullName}");

builder.Host.UseSerilog(); // 替换默认日志为Serilog

// 其他业务代码...

var app = builder.Build();

// 其他中间件配置...

await app.RunAsync();

2. 修正CustomWebApplicationFactory,确保测试配置正确加载

修改CustomWebApplicationFactory,清除默认配置源并指定测试配置文件的正确路径,避免加载API项目的配置:

using System.Reflection;

public class CustomWebApplicationFactory<TProgram> : WebApplicationFactory<TProgram> where TProgram : class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        // 获取测试项目的根目录(避免Directory.GetCurrentDirectory()的路径问题)
        var testAssembly = Assembly.GetExecutingAssembly();
        var testProjectDir = Path.GetDirectoryName(testAssembly.Location);
        // 回溯到测试项目根目录(适配bin目录结构)
        while (!File.Exists(Path.Combine(testProjectDir, "appsettings.Test.json")))
        {
            testProjectDir = Path.GetDirectoryName(testProjectDir);
        }

        builder.ConfigureAppConfiguration((context, conf) =>
        {
            // 清除默认配置源(避免加载API项目的appsettings.json)
            conf.Sources.Clear();
            
            // 添加测试配置文件
            conf.AddJsonFile(Path.Combine(testProjectDir, "appsettings.Test.json"), optional: false, reloadOnChange: true);
            // 可选:添加测试环境的环境变量、命令行参数等配置源
            conf.AddEnvironmentVariables();
        });

        // 设置测试环境
        builder.UseEnvironment("Test");

        builder.ConfigureTestServices(services =>
        {
            // 你的测试服务配置逻辑...
        });
    }
}

3. 确保测试配置文件的复制属性正确

在测试项目中,右键appsettings.Test.json → 属性 → 设置复制到输出目录为如果较新则复制或始终复制,确保文件能被测试程序读取到。

为什么之前的方案无效?

  • 你修改Program.cs添加环境判断后,测试时appsettings.Test.json的路径默认指向API项目的输出目录,而非测试项目目录,导致文件找不到,因此没有日志输出。
  • 旧的CreateHostBuilder重写方式在ASP.NET Core 7的顶级语句Program.cs模式下不再适用,WebApplicationFactory会自动处理Program的启动逻辑,手动重写会破坏这个流程,导致"No Application was selected to run/start"错误。

内容的提问来源于stack exchange,提问作者fingers10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:30:44