Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

MockフレームワークによるEFのテスト

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);

これで、単体テストも捗りますね。