Search Results for

    Show / Hide Table of Contents

    In-Memory Testing

    When performing integration testing, it's sometimes helpful to be able to use an in-memory database (such as Sqlite) to act as the database while tests are running. As a result, this article describes how you can accomplish this with FluentMigrator.

    Credit to Craig on this StackOverflow answer that in turn created an issue for us to add this to the documentation.

    Note: Sqlite only keeps the in-memory database in memory for the time the process is running. In addition, all connection strings that utilize the same name will access the same database.

    Create InMemory database, setup FluentMigrator and execute migrations during test setup:

    public static IDisposable CreateInMemoryDatabase(Assembly AssemblyWithMigrations, IServiceCollection services = null)
    {
        if (services == null)
            services = new ServiceCollection();
    
        var connectionString = GetSharedConnectionString();
        var connection = GetPersistantConnection(connectionString);
        MigrateDb(services, connectionString, AssemblyWithMigrations);
    
        services.AddSingleton<IConnectionFactory>(new InMemoryConnectionFactory(connectionString));
    
        return services.BuildServiceProvider()
            .GetRequiredService<IDisposableUnderlyingQueryingTool>();
    }
    
    private static string GetSharedConnectionString()
    {
        var dbName = Guid.NewGuid().ToString();
        return $"Data Source={dbName};Mode=Memory;Cache=Shared";
    }
    
    private static void MigrateDb(IServiceCollection services, string connectionString, Assembly assemblyWithMigrations)
    {
        var sp = services.AddFluentMigratorCore()
            .ConfigureRunner(fluentMigratorBuilder => fluentMigratorBuilder
                .AddSQLite()
                .WithGlobalConnectionString(connectionString)
                .ScanIn(assemblyWithMigrations).For.All() // Get all migrations, maintenance migrations and customizations
            )
            .BuildServiceProvider();
    
        var runner = sp.GetRequiredService<IMigrationRunner>();
        runner.MigrateUp();
    }
    
    private static IDbConnection GetPersistantConnection(string connectionString)
    {
        var connection = new SqliteConnection(connectionString);
        connection.Open();
    
        return connection;
    }
    

    This serves as an example test utilizing the static methods above:

    [TestFixture]
    public Test : IDisposable {
        private readonly IDisposable _holdingConnection;
    
        [Test]
        public Test() {
            _holdingConnection = CreateInMemoryDatabase(typeof(MyFirstMigration).Assembly);
        }
    
        public void Dispose() {
            _holdingConnection.Dispose();
        }
    }
    
    • Edit this page
    In this article
    Back to top
    Copyright © 2018 Fluent Migrator Project
    Generated by DocFX
    Creative Commons License
    FluentMigrator Documentation by FluentMigrator Project is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.