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

ASP.NET Core集成测试中配置传递失败,AddInMemoryCollection()不生效的问题排查

ASP.NET Core集成测试中配置传递失败,AddInMemoryCollection()不生效的问题排查

我来帮你排查这个问题,你遇到的核心问题其实是在ConfigureAppConfiguration委托里的一个小细节——你错误地重新赋值了config变量,导致内存配置根本没被添加到原有的配置构建器中。

问题根源分析

在你的代码里,你写了:

config = config.AddInMemoryCollection(overrides);

这里的问题在于,AddInMemoryCollection()是一个扩展方法,它会修改原有的配置构建器实例并返回自身。但你把返回值重新赋值给了局部变量config,这只会改变这个局部变量的引用,而不会影响外部的配置构建器(也就是WebApplicationFactory正在使用的那个)。相当于你在委托里创建了一个新的配置构建器,但根本没把它传递回去,自然也就不会生效。

修正方案

只需要把这行代码改成直接调用AddInMemoryCollection()而不赋值即可:

config.AddInMemoryCollection(overrides);

去掉config =这部分,这样就会把内存配置添加到原有的配置构建器中,而不是创建一个无效的局部变量。

修正后的完整测试代码片段

你的AuthControllerTests构造函数里的配置部分应该改成这样:

var customFactory = factory.WithWebHostBuilder(builder =>
{
    builder.UseEnvironment("Development");
    builder.ConfigureAppConfiguration((context, config) =>
    {
        var overrides = new Dictionary<string, string?>
        {
            { "ConnectionStrings:AuthConnection", _authDbFixture.ConnectionString },
            { "ConnectionStrings:MaterialsConnection", _materialsDbFixture.ConnectionString }
        };
        // 直接调用AddInMemoryCollection,不要重新赋值config
        config.AddInMemoryCollection(overrides);
    });
});
_client = customFactory.CreateClient();

验证方法

修正后,你可以在Program.cs里临时加一行代码打印所有配置源,确认内存配置是否被加载:

foreach (var source in builder.Configuration.Sources)
{
    Console.WriteLine($"配置源类型:{source.GetType().Name}");
}

运行测试时,你应该能看到MemoryConfigurationSource的输出,说明内存配置已经被正确添加。这时候再去掉appsettings.Development.json里的连接字符串,GetConnectionString()就会返回你从TestContainers传递过来的正确值了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:08:00