NDDD

ドメイン駆動開発_フォルダー構成編_#14_ Mockの作成

前回までで,RepositoryとEntityの作成をしました。今回はMockの作成をしていきたいと思います。Mockとは,データベース等のアプリケーションの外部からデータを取得するような処理を,外部と接触せずに,テスト用のデータを流し込んでくるための実装方法です。

Mockの作成

LatestViewModelTestに次のようにコードを追加してください。

テスト用のデータ

まず,次のentityのインスタンスは,テストコードを実施して,GetLatestが呼び出されたときに返却される値をEntityとして生成しています。これは,今回のテストコードで次のような値が返却されることを期待してテストコードを書いているので,そのような値でEntityを作成しています。

次のコードの解説です。

まず,最初のmeasureMoqの生成は,インストールしたMoqのMockという型で宣言します。カッコ<>の中は,リポジトリーを設定します。こうすることで,リポジトリーで宣言されている関数を読んだときに,テスト用の値を返却できるようになります。

次のmeasureMoq.Setupの行は,IMeasureRepositoryのGetLatestが呼び出されたときにentityを返却するように指定しています。この設定により,GetLatestが呼ばれたときに,実際にはデータベースに接続するはずの処理が,それを行わずに,テストデータのEntityを返却してくれるようになります。

最後の行「var vm = new LatestViewModel(measureMoq.Object);」はこれまで実装していた行ですが,引数にmeasureMoq.Objectを引き渡しています。ViewModel側でテストコードから呼び出された時のみ,Mockを使用するように記載する必要があります。

ViewModelでリポジトリーを受けられるようにする

テストコードからMockを渡すようにしたので,ViewModel側では,そのMockを受けられるようにします。Mockはリポジトリーの型で投げられるので,IMeasureRepositoryの引数を作成します。これで,テストコードの時はMockがセットされることになります。本番実行の時は,データベース等に接続されるように_measureRepositoryを生成する必要があります。

Searchの実装

Search()メソッドに「_measure = _measureRepository.GetLatest();」と記載します。 _measureはクラスの上部でMeasureEntityの型で宣言しておきます。これで,Searchメソッドが呼び出されるとリポジトリーのGetLatestが呼び出され,ViewModelの_measureにセットされることになります。

最後にプロパティのgetの部分を改造します。_measureがnullでない場合のみ,各画面のテキストボックスの表示で期待される形式にして返却するようにしています。AreaIdTextは4桁の0詰めの文字列,MeasureDateTextは年月日時分秒,MeasureValueTextは,小数点以下2桁で丸めて,単位を「℃」で表示するように編集しています。

テストの実行

これで,LatestViewModelTestに記載したテストコードが求める値をViewModelで設定できるようになったので,テストを実行すると成功します。

NDDD

C#プログラマーのための正しい3層構造が分かる「C#アーキテクチャー解説動画」をここで公開しています。よかったら見てみてください。

#01_プロジェクトの作成
#02_プロジェクトの追加
#03_依存関係
#04_ドメイン駆動開発でApplication層は必要?
#05_Domainのフォルダー構成
#06_Infrastructureのフォルダー構成
#07_WinFormのフォルダー構成
#08_Testsのフォルダー構成
#09_テスト駆動で実装するための事前準備
#10_テストコードとViewModelの追加
#11_テストコードを追加する
#12_ Repositoriesフォルダーの作成
#13_ Entitiesフォルダーの作成
#14_ Mockの作成
#15_フォーム画面の作成
#16_画面のコントロールデータバインドする
#17_Fakeを使ってタミーデータを画面に表示させる
#18_Fakeデータを画面に通知する
#19_PropertyChangedの方法を変更する
#20_Fakeとデータベースの値を切り替える方法
#21_Sharedクラスを作成する
#22_クラスを生成するファクトリークラスを作る
#23_#if DEBUGでFakeデータがリリースされないようにする
#24_DEBUGモードであることをわかりやすくしておく
#25_Factories以外から生成できないようにしておく
#26_Factoriesの呼び出しはViewModelで行う
#27_外部の設定ファイルの値で判断する
#28_Fakeデータを切り替える方法
#29_FakePathを設定ファイルとSharedに移す
#30_Fakeデータのバリエーション
#31_Shareクラスの活用方法
#32_ベースフォームを作る
#33_SharedにログインIDを記憶する
#34_BaseFormでログインユーザーを表示する
#35_ValueObject
#36_ValueObjectを作成する
#37_抽象クラスValueObjectを使用してイコールの問題の解消
#38_AreaIdにビジネスロジックを入れる
#39_AreaIdクラスをEntityに乗せる
#40_MeasureDateの作成
#41_MeasureValueの作成
#42_オブジェクト指向の自動化
#43_Repositoryの具象クラス
#44_例外処理
#45_例外の作成
#46_インナーエクセプション
#47_例外の欠点
#48_メッセージの区分
#49_エラー処理の共通化
#50_ログの出力
#51_タイマー処理はどこに置く?
#52_タイマークラスの作成
#53_StaticValues
#54_Logics
#55_Helpers
#56_Module
#57_トランザクションはどこでかける?
#58_特徴を見極める
#59_さいごに

 

参考図書

ドメイン駆動開発

エリック・エヴァンスのドメイン駆動設計

実践ドメイン駆動設計

ドメイン駆動

現場で役立つシステム設計の原則

エンタープライズアプリケーションアーキテクチャパターン

デザインパターン

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向のこころ

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

オブジェクト指向

ジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技
  すばらしい本です。オブジェクト指向が詰まっています。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
  サンプルコードはjavaですが,最初にオブジェクト指向に目覚めるのに最適な本です。

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本
  マンガみたいな感じで読めて,オブジェクト指向について学べます。  

Clean Code アジャイルソフトウェア達人の技

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Adaptive Code ~ C#実践開発手法

.NETのエンタープライズアプリケーションアーキテクチャ

実装パターン
  廃盤のため異常に高くなりすぎなので,様子を見た方がいい気がします。一万円のボリュームがあるかどうかは微妙です。

オブジェクト指向でなぜつくるのか

レガシーコード改善ガイド

リファクタリング 既存のコードを安全に改善する

C#でオブジェクト指向をする方法

オブジェクト指向の原則1:単一責務の原則