Fluent Migrator 单元测试:保持连接
Fluent Migrator Unit Tests: Holding onto Connection
我正在尝试创建一个单元测试项目以确保项目中进行的所有迁移都将成功允许向上和向下迁移。
我试图通过创建两个单元测试来实现这一点。
设置:
- N单位
- EntityFramework
- 本地数据库
FluentMigrator 和跑步者
这是我的单元测试设置。我有一个连接字符串 link 到所有这些测试都使用的 LocalDb 数据库 (v11):
[TestFixture]
public class MigrationTestHandler
{
private string ConnectionString
{
get
{
return ConfigurationManager.ConnectionStrings["MigrationDatabase"].ConnectionString;
}
}
[SetUp]
public void SetUp()
{
var blankContext = new DbContext(ConnectionString);
blankContext.Database.Delete();
blankContext.Database.Create();
}
[TearDown]
public void TearDown()
{
var blankContext = new DbContext(ConnectionString);
blankContext.Database.Delete();
}
[Test]
public void CanUpgradeDatabase()
{
var migrator = new MigrationRunnerHandler(ConnectionString);
migrator.Migrate(runner => runner.MigrateUp());
}
[Test]
public void CanRollbackDatabase()
{
var migrator = new MigrationRunnerHandler(ConnectionString);
migrator.Migrate(runner => runner.MigrateUp());
migrator.Migrate(runner => runner.Rollback(int.MaxValue));
}
}
这是我用来调用所有迁移的迁移运行器处理程序class:
public class MigrationRunnerHandler
{
private readonly string _connectionString;
private FluentMigrator.Runner.MigrationRunner Runner { get; set; }
public MigrationRunnerHandler(string connectionString)
{
_connectionString = connectionString;
}
private class MigrationOptions : IMigrationProcessorOptions
{
public bool PreviewOnly { get; set; }
public int Timeout { get; set; }
public string ProviderSwitches { get; set; }
}
public void Migrate(Action<IMigrationRunner> runnerAction)
{
var factory = new SqlServer2008ProcessorFactory();
var assembly = Assembly.GetExecutingAssembly();
var announcer = new TextWriterAnnouncer(s => Console.Write(s));
var migrationContext = new RunnerContext(announcer)
{
TransactionPerSession = true,
};
var processor = factory.Create(_connectionString, announcer, new MigrationOptions
{
PreviewOnly = false,
Timeout = 5
});
Runner = new FluentMigrator.Runner.MigrationRunner(assembly, migrationContext, processor);
runnerAction(Runner);
}
}
问题是在拆解我的测试时,FluentMigrator 似乎保持与数据库的连接。 运行 sp_who on the database 说明数据库上有一个"sleeping"进程是"AWAITING COMMAND"留在数据库上。这意味着我的测试的 TearDown 将无法删除临时数据库 "the database is in use".
查看运行程序,我似乎找不到关闭此连接的方法,我尝试更改所有相关组件的超时时间,还尝试关闭连接字符串 "Pooling" 但是都没有用。
有什么方法可以关闭此连接或确保它已关闭?
谢谢
由于 IMigrationProcessor 实现了 IDisposable,我们应该这样使用它:
using(var processor = factory.Create(_connectionString, announcer, new MigrationOptions
{
PreviewOnly = false,
Timeout = 5
}))
{
Runner = new FluentMigrator.Runner.MigrationRunner(assembly, migrationContext, processor);
runnerAction(Runner);
}
我还假设,未处理处理器是挂起连接的原因。
我正在尝试创建一个单元测试项目以确保项目中进行的所有迁移都将成功允许向上和向下迁移。
我试图通过创建两个单元测试来实现这一点。
设置:
- N单位
- EntityFramework
- 本地数据库 FluentMigrator 和跑步者
这是我的单元测试设置。我有一个连接字符串 link 到所有这些测试都使用的 LocalDb 数据库 (v11):
[TestFixture]
public class MigrationTestHandler
{
private string ConnectionString
{
get
{
return ConfigurationManager.ConnectionStrings["MigrationDatabase"].ConnectionString;
}
}
[SetUp]
public void SetUp()
{
var blankContext = new DbContext(ConnectionString);
blankContext.Database.Delete();
blankContext.Database.Create();
}
[TearDown]
public void TearDown()
{
var blankContext = new DbContext(ConnectionString);
blankContext.Database.Delete();
}
[Test]
public void CanUpgradeDatabase()
{
var migrator = new MigrationRunnerHandler(ConnectionString);
migrator.Migrate(runner => runner.MigrateUp());
}
[Test]
public void CanRollbackDatabase()
{
var migrator = new MigrationRunnerHandler(ConnectionString);
migrator.Migrate(runner => runner.MigrateUp());
migrator.Migrate(runner => runner.Rollback(int.MaxValue));
}
}
这是我用来调用所有迁移的迁移运行器处理程序class:
public class MigrationRunnerHandler
{
private readonly string _connectionString;
private FluentMigrator.Runner.MigrationRunner Runner { get; set; }
public MigrationRunnerHandler(string connectionString)
{
_connectionString = connectionString;
}
private class MigrationOptions : IMigrationProcessorOptions
{
public bool PreviewOnly { get; set; }
public int Timeout { get; set; }
public string ProviderSwitches { get; set; }
}
public void Migrate(Action<IMigrationRunner> runnerAction)
{
var factory = new SqlServer2008ProcessorFactory();
var assembly = Assembly.GetExecutingAssembly();
var announcer = new TextWriterAnnouncer(s => Console.Write(s));
var migrationContext = new RunnerContext(announcer)
{
TransactionPerSession = true,
};
var processor = factory.Create(_connectionString, announcer, new MigrationOptions
{
PreviewOnly = false,
Timeout = 5
});
Runner = new FluentMigrator.Runner.MigrationRunner(assembly, migrationContext, processor);
runnerAction(Runner);
}
}
问题是在拆解我的测试时,FluentMigrator 似乎保持与数据库的连接。 运行 sp_who on the database 说明数据库上有一个"sleeping"进程是"AWAITING COMMAND"留在数据库上。这意味着我的测试的 TearDown 将无法删除临时数据库 "the database is in use".
查看运行程序,我似乎找不到关闭此连接的方法,我尝试更改所有相关组件的超时时间,还尝试关闭连接字符串 "Pooling" 但是都没有用。
有什么方法可以关闭此连接或确保它已关闭?
谢谢
由于 IMigrationProcessor 实现了 IDisposable,我们应该这样使用它:
using(var processor = factory.Create(_connectionString, announcer, new MigrationOptions
{
PreviewOnly = false,
Timeout = 5
}))
{
Runner = new FluentMigrator.Runner.MigrationRunner(assembly, migrationContext, processor);
runnerAction(Runner);
}
我还假设,未处理处理器是挂起连接的原因。