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
相关产品推荐
相关产品推荐

