リポジトリパターンにおける単体テスト
リポジトリパターンのメリットの一つに単体テストの容易さについても挙げました。これから実際にリポジトリパターンの単体テストの容易さ、また便利さについて触れていきます。
リポジトリパターンの単体テスト構築は基本的にアプリケーション構築と同じ流れです。
- モックデータの準備(作成)
- リポジトリインターフェイスを実装したモッククラスの作成
- テストクラス(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が一致するデータのみを取得しています。
ここまででテスト前の下準備は完了です。ここからテストを行います。
