DbContextはMoqで置き換えれない。UseInMemoryを使う(C# EFCore)

DbContextはMoqで置き換えられない

単体テストの自動化の際に、DbContextをMoqで置き換えられず、つまづくということがありました。

どうやらDbContextは、クラスである(インタフェースでない)ためMoqで置き換えられないようです。
実体がなければ、一応置き換えられるっぽい?

それで色々と調べてみたのですが、DbContextでは、Moqではなく代わりに
UseInMemoryDatabaseを使うとよいみたいです。

EF Core を使用するアプリケーションのテストの概要 - EF Core
Entity Framework Core を使用するアプリケーションのテストの概要

スポンサーリンク

UseInMemoryDatabaseを使う

UseInMemoryDatabaseを使ってみます。まずはNuGetでインストールします。

NuGet

install-package Microsoft.EntityFrameworkCore.InMemory

公式を参考に使い方をまとめると、以下のような感じです。

まず、namespaceを追加しときます。

using Microsoft.EntityFrameworkCore.InMemory;

次に、単体テストクラスのコンストラクタなどで、DbContextをインスタンス化します。

//DbContextのオプションを作成
var options = new DbContextOptionsBuilder<BloggingContext>()
  .UseInMemoryDatabase(databaseName: "UnitTestDB")
  .Options;

//DbContextをインスタンス化
var context = new BloggingContext(options);

以上で、単体テスト用のDbContextができあがりました。

あとは、テストしたい内容によって、必要なデータをcontextにAddすればいいだけです。

//データを追加
context.Blogs.Add(new Blog());
context.SaveChanges();

思ったよりも簡単に使えていいですね。

コメント

タイトルとURLをコピーしました