【问题标题】:Fluent Migrator Unit Tests: Holding onto ConnectionFluent Migrator 单元测试:保持连接
【发布时间】:2015-08-04 13:17:20
【问题描述】:

我正在尝试创建一个单元测试项目,以确保项目中进行的所有迁移都将成功地允许向上和向下迁移。

我试图通过创建两个单元测试来实现这一点。

设置:

  • NUnit
  • 实体框架
  • 本地数据库 FluentMigrator 和跑步者

这是我的单元测试设置。我有一个连接字符串,它是所有这些测试都使用的 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));
    }
}

这是我用来调用所有迁移的迁移运行器处理程序类:

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 显示数据库上有一个“休眠”进程,即留在数据库上的“等待命令”。这意味着我的测试的 TearDown 将无法删除临时数据库,因为“数据库正在使用中”。

查看跑步者,我似乎找不到关闭此连接的方法,我尝试更改所有相关组件的超时时间,并尝试关闭连接字符串上的“Pooling”,但都没有奏效。

有没有办法可以关闭此连接或确保它已关闭?

谢谢

【问题讨论】:

    标签: c# entity-framework fluent-migrator


    【解决方案1】:

    由于 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);
    }
    

    我还假设,不处理处理器是连接挂起的原因。

    【讨论】:

    • 这非常有效,谢谢。我对自己有点恼火我没有注意到 IDisposable,应该使用工厂猜到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多