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

如何获取Testcontainers创建的MS SQL容器连接串并覆盖配置

解决Testcontainers MSSQL容器连接字符串获取与配置覆盖问题

一、从Docker Desktop获取连接字符串

  • 打开Docker Desktop,进入Containers页面找到目标MSSQL测试容器
  • 点击容器进入详情页,切换到Inspect标签:
    • 在NetworkSettings.Ports下找到宿主机映射的端口(容器内默认是1433端口,映射到宿主机随机端口)
    • 在Config.Env中确认用户名(默认是sa)和你设置的密码
  • 手动拼接连接字符串:
    Server=localhost,<宿主机映射端口>;Database=master;User Id=sa;Password=Sup3r.Str0ng.P4ss;TrustServerCertificate=True;
    
    注:TrustServerCertificate=True是测试环境必需,用于跳过SSL证书验证。

二、通过C#代码获取并覆盖配置

你的现有代码存在异步方法未等待的问题,容器未完全启动就执行后续操作会导致连接失败,先修正并获取连接串:

1. 修正测试代码,直接获取连接串

[Given("a valid file request (.*)")]
public async Task GivenAValidFileUploaded(string fileName) // 改为异步方法
{
    var testcontainersBuilder = new TestcontainersBuilder<MsSqlTestcontainer>()
            .WithDatabase(new MsSqlTestcontainerConfiguration
            {
                Password = "Sup3r.Str0ng.P4ss"
            });

    var testContainer = testcontainersBuilder.Build();
    await testContainer.StartAsync(); // 等待容器启动完成

    // 直接从Testcontainer实例获取封装好的连接字符串
    string connectionString = testContainer.ConnectionString;
    
    var body = GetFile(fileName);
    _scenarioContext.Set(body, "Body");
    _scenarioContext.Set(connectionString, "TestDbConnection"); // 存入上下文供后续步骤使用
}

2. 覆盖appsettings.json配置

如果你的测试依赖配置文件中的连接串,可以通过以下方式覆盖:

  • 若使用ASP.NET Core测试的WebApplicationFactory,可在工厂内修改配置:
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
    public string TestDbConnectionString { get; set; }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration(config =>
        {
            // 覆盖指定的连接串配置项
            config.AddInMemoryCollection(new Dictionary<string, string>
            {
                { "ConnectionStrings:YourDbKey", TestDbConnectionString }
            });
        });
    }
}
  • 也可以在使用Dapper的直接逻辑中,跳过配置读取,直接使用从ScenarioContext取出的connectionString。

三、关键注意事项

  • 必须等待StartAsync()执行完成后再获取连接串,否则容器未就绪会引发连接错误
  • MsSqlTestcontainer已封装ConnectionString属性,无需手动拼接,该属性自动包含TrustServerCertificate=True
  • 测试完成后建议调用await testContainer.StopAsync()释放容器资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:58:57