我正在尝试为我的微服务创建集成测试,类似于Spotify 的方法。
我仍在研究如何启动和播种数据库。目前我有一个带有FluentDocker v2.2.15 和DbUp 4.1.0 的 .NET Core 2.0 项目。
我使用 FluentDocker 调用 DockerCompose 并启动我的服务,包括SQL Server 容器
var hosts = new Hosts().Discover();
var dockerHost = hosts.FirstOrDefault(x => x.IsNative) ?? hosts.FirstOrDefault(x => x.Name == "default");
if (dockerHost == null)
{
return;
}
var composeFile = Args["composeFile"];
var result = dockerHost.Host.ComposeUp(composeFile: composeFile);
然后我使用 DbUp 运行我的脚本并为数据库播种。
var connectionString = Args["connectionString"];
var scriptsPath = Args["scriptsPath"];
EnsureDatabase.For.SqlDatabase(connectionString);
var upgradeEngine = DeployChanges.To.SqlDatabase(connectionString).WithScriptsFromFileSystem(scriptsPath).Build();
var result = upgradeEngine.PerformUpgrade();
当我给 SQL Server 足够的时间来启动它时,例如在调试时,我可以成功运行它。但是,如果我全速运行它,那么 DbUp 会在它尚未准备好时尝试连接到 SQL Server。FluentDocker 有一个WaitForPort
方法,但它似乎不适用于 DockerCompose API。
我想知道是否有办法在运行脚本之前等待 SQL Server 的端口 1433 响应(不包括非确定性策略,例如await Task.Delay
),或者是否有其他库允许我进行这种控制。
谢谢