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();
思ったよりも簡単に使えていいですね。
コメント