Mockフレームワークを使って、Entity Framework 6(限定)のテストを試してみたので、その備忘録です。詳細は以下のURLを参照。
とりあえず、Northwind DBからモデルを生成した状態から始めて見ます。
Mockフレームワークの追加
NugetからMoqパッケージを追加。
PM> Install-Package Moq 'Moq 4.2.1402.2112' をインストールしています。 'Moq 4.2.1402.2112' が正常にインストールされました。 'Moq 4.2.1402.2112' を XX に追加しています。 'Moq 4.2.1402.2112' が XX に正常に追加されました。
クエリ
適当なダミーデータを突っ込んでクエリするコードを書いてみます。用意するデータは適当にリストに突っ込んで、IQueryableにしておきます。次にMockオブジェクトを生成して、必要な設定を行っておきます。多分定型コードかと思われます。
最後に、Mock#Objectプロパティから、必要なNorthwindのContextオブジェクトが取得できますので、あとは適当にクエリを書けばよいでしょう。
IQueryable<Employee> henatai = new List<Employee> { new Employee {FirstName = "No1"}, new Employee {FirstName = "harutama"}, new Employee {FirstName = "shibayan"}, new Employee {FirstName = "k1hash"}, new Employee {FirstName = "normalian"}, new Employee {FirstName = "kinmugi"} }.AsQueryable(); var mockSet = new Mock<DbSet<Employee>>(); mockSet.As<IQueryable<Employee>>().Setup(m => m.Provider).Returns(henatai.Provider); mockSet.As<IQueryable<Employee>>().Setup(m => m.Expression).Returns(henatai.Expression); mockSet.As<IQueryable<Employee>>().Setup(m => m.ElementType).Returns(henatai.ElementType); mockSet.As<IQueryable<Employee>>().Setup(m => m.GetEnumerator()).Returns(henatai.GetEnumerator()); var mockContext = new Mock<NorthWindEntities>(); mockContext.Setup(c => c.Employees).Returns(mockSet.Object); NorthWindEntities ctx = mockContext.Object; // クエリ var query = from hentai in ctx.Employees select hentai.FirstName; query.ToList().ForEach(Console.WriteLine);
これで、単体テストも捗りますね。