【发布时间】:2018-11-25 10:04:55
【问题描述】:
我正在尝试为我的微服务创建类似于 Spotify's approach 的集成测试。
我仍在研究如何启动和播种数据库。 目前我有一个带有FluentDocker v2.2.15 和DbUp 4.1.0 的.NET Core 2.0 项目。
我使用 FluentDocker 调用 DockerCompose 并启动我的服务,包括SQL Server container
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 之类的非确定性策略),或者是否有其他库可以让我拥有这种控制。
谢谢
【问题讨论】:
-
等待端口 1433 不一定足够——此时 SQL Server 可能仍在启动数据库的过程中(尽管所有系统数据库都应该启动,所以
CREATE DATABASE需要一个新的无论如何都应该工作)。即便如此,更好的方法是等待一个简单的查询成功(如SELECT TOP(0) * FROM master.sys.tables)。在“本机” docker-compose 中,这可以通过depends_on运行状况检查来完成。对于 FluentDocker,没有任何线索。 -
您应该能够使用 FluentDocker 对 compose 文件执行
depends_on,因为它将使用docker-compose本机二进制文件来驱动 compose 文件。
标签: c# sql-server docker-compose dbup fluent-docker