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

WebApplicationFactory读取API项目而非测试项目连接串问题排查

问题根源与修复方案

核心问题

你的测试工厂没有正确读取测试项目的配置,问题出在两个关键点:

  1. 静态类ConfigurationReader的读取逻辑:它通过Directory.GetCurrentDirectory()读取当前目录的appsettings.json,但测试运行时,当前工作目录默认是API项目的输出目录,而非测试项目目录,因此读取的是API项目的生产环境连接字符串。
  2. 测试工厂中错误的配置获取方式:手动注册SettingsContext时调用了这个静态类的方法,导致始终拿到错误的连接串。

快速修复方案(修改测试工厂)

直接在测试工厂中配置并使用测试项目的配置源,不再依赖静态ConfigurationReader:

internal sealed class TestWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration((context, configBuilder) =>
        {
            // 替换为你的测试项目相对路径(根据实际项目结构调整)
            var testProjectPath = Path.Combine(Directory.GetCurrentDirectory(), "../../../YourTestProjectName");
            // 清除原有配置源,加载测试项目的appsettings
            configBuilder.Sources.Clear();
            configBuilder.SetBasePath(testProjectPath)
                        .AddJsonFile("appsettings.json", optional: false)
                        .AddEnvironmentVariables();
        });

        builder.ConfigureServices(services =>
        {
            // 移除原有DbContext配置
            services.RemoveAll<DbContextOptions<SettingsContext>>();
            // 重新注册DbContext,使用测试环境的配置
            services.AddDbContext<SettingsContext>((container, options) =>
            {
                var configuration = container.GetRequiredService<IConfiguration>();
                var connectionString = configuration.GetConnectionString("SettingsModel");
                options.UseNpgsql(connectionString);
            });
        });
    }
}

长期优化方案(重构配置读取逻辑)

静态类读取配置的方式在测试场景中灵活性极差,建议直接依赖IConfiguration注入,彻底避免此类问题:

  1. 修改API项目的Program.cs:
// 移除静态ConfigurationReader的依赖,直接通过依赖注入获取IConfiguration
builder.Services.AddEntityFrameworkNpgsql()
    .AddDbContext<SettingsContext>((serviceProvider, options) =>
    {
        var configuration = serviceProvider.GetRequiredService<IConfiguration>();
        var connectionString = configuration.GetConnectionString("SettingsModel");
        options.UseNpgsql(connectionString);
    });
  1. 删除ConfigurationReader静态类

  2. 简化测试工厂:

internal sealed class TestWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration((context, configBuilder) =>
        {
            var testProjectPath = Path.Combine(Directory.GetCurrentDirectory(), "../../../YourTestProjectName");
            configBuilder.Sources.Clear();
            configBuilder.SetBasePath(testProjectPath)
                        .AddJsonFile("appsettings.json", optional: false)
                        .AddEnvironmentVariables();
        });
    }
}

此时测试工厂仅需替换配置源,Program.cs中注册的SettingsContext会自动读取测试环境的连接字符串,无需手动移除和重新注册。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:43:36