Search code examples
databasesqliteunit-testingnunitfluent-migrator

How to test fluent migrations with an in-process migration runner and a in memory SQLite database


I have just started to use FluentMigration for my current project. I wrote my first migration but I have some trouble writing a unit test for it.

Here is some sample code:

private ServiceProvider CreateServiceProvider()
{
    return new ServiceCollection()
        .AddLogging(lb => lb.AddFluentMigratorConsole())
        .AddFluentMigratorCore()
        .ConfigureRunner(
            builder => builder
                .AddSQLite()
                    .WithGlobalConnectionString("Data Source=:memory:;Version=3;New=True;")
                    .WithMigrationsIn(typeof(MigrationOne).Assembly))
            .BuildServiceProvider();
}

private void PerformMigrateUp(IServiceScope scope)
{
    var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();

    runner.MigrateUp(1);
}

[Test]
public void ShouldHaveTablesAfterMigrateUp()
{
    var provider = this.CreateServiceProvider();

    using (var scope = provider.CreateScope())
    {
        this.PerformMigrateUp(scope);

        // here I'd like to test if tables have been created in the database by the migration
    }
}

I don't know how (or if it is possible) to access the current database connection so I can perform a query. Any suggestions would be helpful. Thanks.


Solution

  • Ok, I found a solution. I have to use the Process method of the runner's processor to perform my own sql query.

    It looks like this:

    private ServiceProvider CreateServiceProvider()
    {
        return new ServiceCollection()
            .AddLogging(lb => lb.AddFluentMigratorConsole())
            .AddFluentMigratorCore()
            .ConfigureRunner(
                builder => builder
                    .AddSQLite()
                    .WithGlobalConnectionString(@"Data Source=:memory:;Version=3;New=True;")
                    .WithMigrationsIn(typeof(MigrationDate20181026113000Zero).Assembly))
            .BuildServiceProvider();
    }
    
    [Test]
    public void ShouldHaveNewVersionAfterMigrateUp()
    {
        var serviceProvider = this.CreateServiceProvider();
        var scope = serviceProvider.CreateScope();
        var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();
    
        runner.MigrateUp(1);
    
        string sqlStatement = "SELECT Description FROM VersionInfo";
    
        DataSet dataSet = runner.Processor.Read(sqlStatement, string.Empty);
    
        Assert.That(dataSet, Is.Not.Null);
        Assert.That(dataSet.Tables[0].Rows[0].ItemArray[0], Is.EqualTo("Migration1"));
    }