リポジトリパターンにおける単体テスト
リポジトリパターンのメリットの一つに単体テストの容易さについても挙げました。これから実際にリポジトリパターンの単体テストの容易さ、また便利さについて触れていきます。
リポジトリパターンの単体テスト構築は基本的にアプリケーション構築と同じ流れです。
- モックデータの準備(作成)
- リポジトリインターフェイスを実装したモッククラスの作成
- テストクラス(Controller)への適用
順に解説してきます。
1.モックデータの準備(作成)
ここからはテストプロジェクト(サンプルではRepositorySample.Tests)で開発を行います。
最初にEDMにアクセスする代わりに利用するモックデータの作成を行います。
- ソリューション エクスプローラを展開し、Modelフォルダを新規作成し、そのフォルダ上で[新しい項目の追加]を選択。
- 選択後[新しい項目の追加]ダイアログが表示されるので、テンプレートとして「クラス」を選択し、名前を「FakePubsData.cs」と設定後[追加]ボタンをクリック
作成するモックデータは、List型(複数レコード)、エンティティ型(1レコード)、FormCollection型(入力されたデータを取得)の計3つを作成します。
using System; using System.Collections.Generic; using System.Web.Mvc; using RepositorySample.Models; namespace RepositorySample.Tests.Model { class FakePubsData { // テストデータリスト public static List<titles> CreateTestData() { List<titles> _titles = new List<titles>(); for (int i = 0; i < 20; i++) { titles SampleTitles = new titles() { title_id = i.ToString(), advance = 1000, title = "Sample Book" + i.ToString(), royalty = 10, price = 30, pubdate = DateTime.Now.AddDays(i), notes = i.ToString(), type = "Fake", }; _titles.Add(SampleTitles); } return _titles; } // 新規データ作成 public static titles CreateTitles() { titles _titles = new titles(); _titles.title_id = "TA1107"; _titles.advance = 2000; _titles.title = "Tamaki's Photo Diary"; _titles.royalty = 50; _titles.price = 100; _titles.pubdate = DateTime.Now; _titles.type = "Family"; return _titles; } // FormCollectionデータ作成 public static FormCollection CreateTitlesFormCollection() { var form = new FormCollection(); form.Add("title_id", "TA1107"); form.Add("title", "Tamaki's Photo Diary"); form.Add("price", "100"); form.Add("pubdate", DateTime.Now.ToString()); form.Add("type", "Family"); return form; } } }
List型の項目はforループで指定数分(サンプルは20個)作成しています。新規登録モックデータ、FormCollectionデータは適当な値を入力し作成しています。この部分はあくまでテスト用データなので分かりやすくシンプルな値を格納してください。
テストデータの作成は以上です。
2.リポジトリインターフェイスを実装したモッククラスの作成
続いてインターフェイスを実装したクラスの作成です。
- ソリューション エクスプローラを展開し、Modelフォルダ上で[新しい項目の追加]を選択。
- 選択後[新しい項目の追加]ダイアログが表示されるので、テンプレートとして「クラス」を選択し、名前を「PubsRepositoryTest.cs」と設定後[追加]ボタンをクリック
このモッククラスはEDMではなくList型やエンティティ型の扱い方を記述します。
using System; using System.Collections.Generic; using System.Linq; using RepositorySample.Models; namespace RepositorySample.Tests.Model { class PubsRepositoryTest : IPubsRepository { private List<titles> titlesList; public PubsRepositoryTest(List<titles> titles) { titlesList = titles; } // ① public IQueryable<titles> FindAllTitles() { return titlesList.AsQueryable(); } // ② public titles GetDetailTitles(string id) { return titlesList.SingleOrDefault(t => t.title_id == id); } public void Add(titles _titles) { titlesList.Add(_titles); } public void Delete(titles _titles) { titlesList.Remove(_titles); } public void Save() { } } }
リポジトリモッククラスも扱う対象が変わっただけで、原則的な機能は変わりありません。数字の部分だけ解説します。
- FindAllTitles()モックメソッドは、List型をIQueryable型に変換するAsQueryableメソッドを使い、値を返しています。
- LINQを使い、idが一致するデータのみを取得しています。
ここまででテスト前の下準備は完了です。ここからテストを行います。