NDDD

ドメイン駆動開発_フォルダー構成編_#10_テストコードとViewModelの追加

前回は,Testsプロジェクトへのフォルダー追加と,WinFormプロジェクトへのフォルダー追加を行い,さらにViewModelsフォルダーにViewModelBaseクラスを作成してもらいました。今回は実際にテストクラスとViewModelクラスを作成していきます。

テストコードの追加

それではテストコードを作成していきます。テストコードを書くには,テストコードを書くためのクラスを作成します。Testsプロジェクトの「ViewModelTests」フォルダーを右クリックして,「追加」「単体テスト」を選択し,テストクラスを作成します。

「UnitTest1.cs」というテストクラスが作成されます。デフォルトの名前になってしまっているので,名前を適切な名前のクラス名「LatestViewModelTest」に変更します。

ファイル名を変更したことで,次のようなメッセージが表示されます。

これに「はい」で応答してください。そうすると,変更したファイル名でクラス名が変更されます。もし表示されない場合は,自分でクラス名をLatestViewModelTestに変更しましょう。

今回は,データベースなどのディスクからデータを取得して画面に表示させるというシンプルな例を取り上げるため,最初に作成するクラスは「直近値画面」に対応するViewModelになります。よって直近値画面に対応するViewModelのテストクラスということで,

LatestViewModelTestという名前にしました。テストクラスはテスト対象のクラス名の語尾に「Test」とつけるようにしています。

ここまで出来たら,次のようにコードを書きます。「TestMethod1」となっているデフォルトのテスト名は「シナリオ」という日本語に書き換えます。テストコードは外部から呼び出すコードではないので,日本語で何のテストをしているかがわかるようにするほうが良いと私は思っているので,このように日本語でメソッド名は命名しています。メソッド名を「シナリオ」としたら,LatestViewModelのインスタンスを生成する1行をかきます。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace NDDDTest.Tests.ViewModelTests
{
    [TestClass]
    public class LatestViewModelTest
    {
        [TestMethod]
        public void シナリオ()
        {
            var vm = new LatestViewModel();
        }
    }
}

LatestViewModelはまだ存在しないので,コンパイルエラーになります。テスト駆動開発ではこのように,まだ存在しないクラスやメソッド,プロパティに対して,先にテストコードを書いて,必要に応じて,クラス等を作成していきます。このようにすることで,すべてのコードがテストコードでカバーされ,さらに,必要なコードしか存在しないという状態になります。実際にはすべてのコードをカバーするのは大変なので,90%程度がカバーされるイメージでよいと思います。

ViewModelの追加

それではLatestViewModelを作成しましょう。

WinFormプロジェクトの「ViewModels」フォルダーを右クリックして,「追加」「新しいフォルダー」を選択し,「LatestViewModel.cs」という名前でクラスを作成し,次のようにコーディングします。ViewModelBaseを継承しています。

namespace NDDD.WinForm.ViewModels
{
    public class LatestViewModel : ViewModelBase
    {
    }
}

これでLatestViewModelTestクラスに「using NDDD.WinForm.ViewModels;」を追加すれば,コンパイルエラーが解消されます。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NDDD.WinForm.ViewModels;

namespace NDDDTest.Tests.ViewModelTests
{
    [TestClass]
    public class LatestViewModelTest
    {
        [TestMethod]
        public void シナリオ()
        {
            var vm = new LatestViewModel();
        }
    }
}

コンパイルエラーの波線が出ているところにカーソルをあてて「ctrl」+「.(ドット)」を押下して,「Enter」を押すと,ショートカットで「using NDDD.WinForm.ViewModels;」が追加されるのでお試しください。

テストの実施

テストエクスプローラーから「すべてを実行」を押下して,試しにテストを実施してみましょう。

グリーンが表示され,テストが成功していることが確認できます。

もし,テストエクスプローラーが表示されていない場合は,ツールバーの「テスト」から「ウィンドウ」「テストエクスプローラー」の順に選択し,表示させてください。

NDDD

#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_さいごに