単体テストを書こうのコーナーです。「ModelStateの単体テストコード、うまくできませぬ」と言われたのでコードを見せてもらったら、コントローラーをnewしてなんちゃらしていた事件があったので、書いておこうと思いました。Injection(DI)について、4種類がどう異なるのかを見たい今日この頃です。Studioは英語版なので日本語の正確な項目名わかりません...涙。1.0」に名称変わるのでタイトルもそう書きたいところですが、名称変更となるRC2、今月(2016/2)リリース予定がTBDに戻ってたので、もう少しこの名称で書いておきましょう。MVC6のプロジェクトを作るまず、プロジェクトをざっくり作ります(説明雑...)。プロジェクト作成」あたりでさらりと作れます。テストの対象となるサンプルのModelを、以下の感じで作ります。}}各種Attributeをつけているので、Idプロパティは、は入力必須Nameプロパティは、文字数の最大が8文字Numberプロパティは、範囲が1~12の間のintという制約です。コントローラーで呼ばれるイメージは、以下です。Project]をクリックしてプロジェクトを追加します。私は、ソリューションの直下(srcと同じ場所)にtestsというフォルダを作ってtestプロジェクトを追加してます。プロジェクト毎にフォルダ作ってその中にテストプロジェクトとプロダクトのプロジェクトを入れるパターンもgithubとかで見ますね。Testのテンプレートを選択してプロジェクト名を入力し、プロジェクトを追加しましょう。次に、xUnitのプロジェクトからプロダクトのプロジェクトがみえるようにします。Reference]をクリックして参照を追加します。追加する参照は、[Projects]の中にあるものです(先ほどModelを追加したプロジェクト)。単体テストの作成ですが、コントローラーをnewしてパラメータを渡すようなことはやめましょう(むしろ、それはあかん)。Validateの処理を直接行って結果を検証するイメージです。サンプル第一弾のテスト内容は、入力必須のはずのIdプロパティに入力値がない場合にします。値をnullにしてます。(stringなので、nullとstring.EmptyやWhiteSpaceの場合もあったりなかったりしますがまずはnullで...)コード書いてしまいます。}コードをざっくり説明すると、テスト用のModelと、Modelに応じたValidationContextを生成して、Validator.TryValidateObjectメソッドを実行。Validationの結果は、boolの戻り値、そのエラー内容は、パラメーターとして渡した「List」にセットしてもらってます。以下のAssertをしてます。Validator.TryValidateObjectメソッドの戻り値は、falseエラーを出力したプロパティ名に「Id」が含まれている(リフレクションでプロパティ名とってこいよとかは...サンプルなので)(何をテストするかと何をAssertするかは、プロジェクトによってちゃんと考えましょう...)ついでにNameプロパティの8文字以内の制約に違反するテストしてみましょう。テスト毎にValidationContextやValidationResultリストをnewするのが辛いので、Tupleの戻り値を持つジェネリックの「ValidateModelState」メソッドを作ってすっきりさせてみました。result);}ValidateModelStateメソッドは、戻り値のTupleの1つ目がValidator.TryValidateObjectメソッドの結果(bool)、2つ目がListです。Assertの内容は、最初のサンプルとほぼ同じです。Item1、Item2は辛いので...次期のC#7で話にでてる名前付きのタプルできるといいですね...ということで、ModelのAttributeに頼って、ごりっごりにテストメソッド書いてプロダクトがハッピーになるといいです。当ブログに掲載されている情報は、必ずしも正確性や安全性を保証するものではありません。掲載された内容によって生じた損害等の一切の責任を負いかねます。当ブログに掲載されている情報は個人の見解であり、所属する団体・組織は一切関係ありません。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。