くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Entity Framework Core で Unit Test しやすくするヘルパークラスを書いた@InMemory-SqLite

こんにちは〜!最近C# でサーバーサイドを雑に書いてます〜(Android アプリを作ってたはずが、気づいたらサーバーサイドを書いていた...

TDD を試しているのですが、 Entity Framework Core という 主にASP.NET Core 向けなORM を利用しているところでもTDDしやすくするためなヘルパークラス作りました。

使うとどれくらい楽になるの?

テンプレート的コードが減るのでプログラマの精神的疲労は1/2 ぐらいになりました(体感

コード行数()的な楽さは 1/3 ぐらいになりました思います!(若干誇張

使い方

これだけあればわかると思う

[Fact]
        void DBにデータを保存することができる()
        {
            var testMock = new InmemoryDBTestMock<{DbContextを継承したクラス}>();

            var context = testMock.Context();
            
                var entity = new {Entitクラス}();
                context.{DbSetのプロパティ}.Add(entity);
                context.SaveChanges();
            
            Assert.Equal(1, context.{DbContextのプロパティ}.Count()); 
        }

ソースコード

雑に作っただけなので動かないとかバグがあるとかは多分あります(テストは通ったけど、そこまで複雑なケースは想定してないです。

public class InmemoryDBTestMock<T> : IDisposable where T : DbContext
{
    private static readonly SqliteConnection Connection = new SqliteConnection("DataSource=:memory:");
    private readonly DbContextOptions _contextOptions = new DbContextOptionsBuilder<T>().UseSqlite(Connection).Options;

    public InmemoryDBTestMock()
    {
        Connection.Open();
        Context().Database.EnsureCreated();
    }
    
    public T Context() => (T) Activator.CreateInstance(typeof(T), _contextOptions);

    public void Dispose()
    {
        Context().Database.EnsureDeleted();
        Connection.Close();
    }
}

 まとめ

需要があればGithubにあげてNuget配布します。