t35 asp.net mvcを使ったtdd入門

29
わわわわわわ わわわわわ #35 by ASP.NET MVC をををを TDD をを SI をををを WEB をををををををhttp://twitter.com/ normlian http://d. hatena .co. jp / waritohutsu http://www.pixiv.net/member.php?id=147209

Upload: normalian

Post on 12-Nov-2014

2.567 views

Category:

Education


0 download

DESCRIPTION

わんくま東京勉強会#35で使用したセッション資料。ASP.NET MVCの活用法が載ってます。

TRANSCRIPT

Page 1: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

by

ASP.NET MVC を使った TDD 入門~ SI 屋さんと WEB 屋さんとの違い~

http://twitter.com/normlianhttp://d.hatena.co.jp/waritohutsuhttp://www.pixiv.net/member.php?id=147209

Page 2: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

自己紹介

• HN : 割と普通• 本拠地 : 横浜近辺• 肩書き : コードをあまり書けない SI

屋• 趣味 : コードを書く&絵を描く• その他 : InfoQ の翻訳者もどき

Page 3: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

今日の流れ

• ASP.NET MVC って何者?• ASP.NET MVC 誰がいつ使う?• ASP.NET MVC をいじってみよう!• ASP.NET MVC による TDD 開発

Page 4: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP .NET MVC って何者?

• WEB アプリ開発用のフレームワーク• Codeplex でソースコードを公開中

.NET Framework

ASP.NET

WebFormASP.NET

MVCASP.NET

Ajax

Page 5: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP .NET MVC って何者? (1/2)

• ASP .NET で M ・ V ・ C のモデルを構築• Model• View• Controller

Controller

Model

View

モデルの呼び出し

View がモデルを参照

Webブラウザ

Page 6: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP .NET MVC って何者? (2/2)

• 認証機能• フィルタ機能

•時間があったらおまけで話します• キャッシュ機能•単体テストの容易性

今日の発表はここメインで♪今日の発表はここメインで♪

Page 7: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

なんで ASP .NET MVC つくったん? (1/3)

•ASP.NET自体のコンセプトは・・?

従来のクラサバシステム開発者が、 WEB 開発にそのまま移行できる開発フレームワークを提供していた

デスクトップアプリの開発手法デスクトップアプリの開発手法・・ WndProcWndProc 、、 WM_XXXWM_XXX 、、イベントドリブン・・・イベントドリブン・・・

WEBWEB アプリの開発アプリの開発   GETGET 、、 POSTPOST 、、 formform ・・・、・・・、セッションセッション

Page 8: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

なんで ASP .NET MVC つくったん? (2/3)

• でも、それはそれで色々と問題が・・・

 ・ ・ ViewStateViewState の埋め込み何とかして・・・の埋め込み何とかして・・・ orzorz

・ コードビハインドは良いけど、・ コードビハインドは良いけど、 ユニットテスト化しにくいよ・・・ ユニットテスト化しにくいよ・・・ orzorz

 ・ ・ JavascriptJavascript 、、 csscss の自動生成されて、他の部品の自動生成されて、他の部品 とコンフリクトしますが何か? とコンフリクトしますが何か?

Page 9: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

なんで ASP .NET MVC つくったん? (3/3)

• 純粋な WEB 開発用フレームワークの台頭• Ruby on Rails (Ruby)• Django (Python)• Cake (PHP)

• 同じ型付言語の Java でも色々と・・・• JSF 、 Struts 、 Spring 、 Wicket

TDD 、 WEB 開発に特化

従来のクラサバ開発者だけでなく、WEB開発者も取り込んでみようかのー・・・かな?

Page 10: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

今日の流れ

• ASP.NET MVC って何者?• ASP.NET MVC 誰がいつ使う?oWEB 屋さんと SI 屋さんの違いoWebForm と MVC の住み分け

• ASP.NET MVC をいじってみよう!• ASP.NET MVC で TDD 開発

Page 11: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP .NET MVC 誰がいつ使う?

• 主な対象はいわゆる WEB 屋さん• 気にするのは開発効率の向上、カスタマイズの容易性とか

• 設計メインな SI 屋さんではない• 気にするのがコンポーネント化、標準化とか

• TDD開発、 Agile開発等で強さを発揮しそう

※ 逆にウォーターフォールとかだと厳しそう

Page 12: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

SI 屋さんと WEB 屋さんの違いってなにさ?( 1/2 )

• SI 屋さんo 業務知識優先o 古き良きウォーターフォールベースo イントラ多し、典型的な CRUD アプリやら帳票やらo 特定ユーザがターゲット ( 特定の法人内とか )

• WEB 屋さんo サービス企画、柔軟で高速な開発 ( ドキュメントは後

から )o アジャイルが割かし多い筈じゃない?o URL やら XHTML やら、デザインが超重要o ユーザが不特定多数多し ( インターネット上 )

いわゆるインターネットの“あちら側”と“こちら側”いわゆるインターネットの“あちら側”と“こちら側”

Page 13: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

SI 屋さんと WEB 屋さんの違いってなにさ?( 2/2 )

WEBWEB 屋 屋 (( 開発者開発者 )) さんさんが主に住んでそうな世界が主に住んでそうな世界

基本設計

開発

連結テスト

総合テスト概要設計

ソースチェック

詳細設計 単体テスト

要件・仕様・予算等を伝える

テスト項目の納品

WEB 屋さんと SI 屋さんで気にするポイントが結構違う

SISI 屋屋 (( 設計者設計者 )) さんが主に住んでそうな世界さんが主に住んでそうな世界

Page 14: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

WebForm と MVC のすみわけ• SI 屋さんの様なタイプ  ( コンポーネント指向 )

o 設計と開発との切り離しが容易o 典型的な CRUDアプリとかならコーディングレス

でもOKo基本設計とテスト項目の整合性チェックとかが楽o コンポーネントを用いた開発標準化が行いやすい

• WEB 屋さん的なタイプ ( リソース指向 )o Agile開発、 TDD 開発向き。o Ajax なんかとの連携しやすいし、デザインにこり

やすいoポストバック、 VIEWSTATE 埋め込み、 CSS 生成はつ

らいo URL ルーティングとか良い感じ

oURL名もデザインできるよ

WebFormWebForm 向き!!向き!!

MVCMVC 向き!!向き!!

Page 15: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

今日の流れ

• ASP.NET MVC って何者?• ASP.NET MVC 誰がいつ使う?• ASP.NET MVC いじってみよう!oModeloViewoController

• ASP.NET MVC を使った TDD 開発MVC を実際に

使って機能を確認

Page 16: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC を使ってみる ~概要 1/2 ~• URL ルーティングされ、実行される Controller がマッピングoURLマッピングからコントローラ&アクションを引き出す

o リフレクションを使ってアクションを実行ルーティングクラルーティングクラスを使ってマッピスを使ってマッピ

ングング

Page 17: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC を使ってみる ~概要 2/2 ~

• Controller が実行され、画面にデータをマッピングo 以下は System.Web.Mvc.MvcHandlerSystem.Web.Mvc.MvcHandler

Controller Controller 作成作成

Controller Controller 実行実行

Page 18: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC 使ってみる ~ Controller 1/2 ~• System.Web.Mvc.Controller で定義• デフォルトでは、 DefaultControllerFactory 辺りから

Controller が抜き出される• Controller のアクションを実行された際

に、 ActionResultクラスを返す

ControllerActionInvoker.cs 辺りを見ると Controllerがどうやって実行されてるかわかるよん

困ったら困ったら Controller.csController.cs クラスを眺めてみよう!クラスを眺めてみよう!

Page 19: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC 使ってみる ~ Controller 2/2~

• Controller 辺りに余計な拡張をしようと思ったら・・• IControllerFactory を実装したクラスに置き換える

といい感じ (現状では DefaultControllerFactory 辺りを継承したクラスでいじると良いかも )

ControllerController に対して、に対して、 DIDI コンテナでインジェクションとかコンテナでインジェクションとか

Page 20: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC を使ってみる ~ Model 1/2~

• System.Web.Mvc.IModelBinder を使ったりできるよ!o バインド用の独自インターフェースを使って

Bindingo アクション実行の段階ではすでにモデルにバイン

ディングされてる (ControllerActionInvoker 内でバインド ) !

ViewModelViewModel クラスクラス

BinderBinder クラスクラス

Page 21: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC を使ってみる ~ Model 2/2~

• Controller#UpdateModel メソッドを使うのも全然有りo Controller 内で明示的にバインディングするo FormCollection と Models なクラスに対するマッピ

ングをリフレクション使ってやってくれる

「プロパティ名 「プロパティ名 == == collection[“namecollection[“name属性”属性” ]] 」の値をマッピング」の値をマッピング

Page 22: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC を使ってみる ~ View 1/2 ~• Controller戻り値 ActionResult の中で、 ViewResult

が *.aspx のレンダーに対応してる

ViewView の検索の検索

ViewView でレンダリングでレンダリング

ViewEngineCollectionViewEngineCollectionからから ViewView を検索を検索

Page 23: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC を使ってみる ~ View 2/2 ~• IViewEngine の標準実装として用意されているのは

WebFormViewEngine• ~/Views仮想パス下から {controller}/{action}.aspx と

かを探して、その WebFormView を作成

Page 24: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

今日の流れ

• ASP.NET MVC って何者?• ASP.NET MVC は誰がいつ使うのか?• ASP.NET MVC をいじってみよう!• ASP.NET MVC を使った TDD 開発

Page 25: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC 上での TDD 開発 (1/2)

• 開発サーバを起動することなくテスト可能

• ActionResult の Model 、 ViewData に対してチェックを行う

基本的に基本的に ControllerController のの引数・戻り値がテスト対引数・戻り値がテスト対

象象

Page 26: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

ASP.NET MVC 上での TDD 開発 (2/2)

• 単体テスト効率化の“コツ”

IRepository*.aspx

Controller

MainRepository( 本番用 )

MockRepository( テスト用 )

ViewData[“key”]ViewData[“key”]ViewData.ModelViewData.Model

画面の表示データに対してチェック

する RepositoryRepositoryパターパターンンを使ってモック

化実際にデモをしてみます!実際にデモをしてみます!

Page 27: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

おまけ その1  Filter 開発

• Controller実行時に適用されるフィルタ

※※IIExceptionFilterExceptionFilter ##OnException()OnException()

1.1. IAuthorizationFilter#OnAuthorization()IAuthorizationFilter#OnAuthorization()

2.2. IActionFilter#OnActionExecuting()IActionFilter#OnActionExecuting()

3.3. コントローラのアクション実行コントローラのアクション実行

4.4. IActionFilter#OnActionExecuted()IActionFilter#OnActionExecuted()

5.5. IResultFilter#OnResultExecuting()IResultFilter#OnResultExecuting()

6.6. ActionResult#ExecuteResult()ActionResult#ExecuteResult()

7. IResultFilter#OnResultExecuted()

例外が発生

Page 28: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

おまけ その2  HtmlHelper の拡張

• *.aspx を作成する際に用いるヘルパークラス

やり過ぎるとやり過ぎると WebFormWebForm と区別がと区別が付かなくなったりするので程々に付かなくなったりするので程々に

Page 29: T35 ASP.NET MVCを使ったTDD入門

わんくま同盟 東京勉強会 #35

まとめ

• 純 WEB 屋さんなら MVC が良い感じ• 元々がデスクトップアプリ開発者なら、無理

に変えなくても良いかも

• 拡張性が非常に高いのは素晴らしいよね• CodePlex に行くと、ソースコードが落とせま

すよ• Futureパッケージ系は楽しそう (非同期実行

とか )