連載:〜ScottGu氏のブログより〜

ASP.NET MVC 1.0 RC版が公開

Scott Guthrie 著/Chica
2009/02/03
Page1 Page2 Page3 Page4

単体テストの改善

 ASP.NET MVC RCには、単体テストに対していくつかの大幅な改善が行われています。

■RequestContextから継承されないように変更されたControllerContext

 RCビルドには、共通の単体テストのシナリオを大幅に簡略化するControllerContextクラスのリファクタリングが行われています。ControllerContextクラスはいまではRequestContextから継承されず、その代わりにRequestContextをカプセル化し、プロパティとしてそれを公開しています。ControllerContextのプロパティとその継承された型もいまではsealedではなくvirtualになったため、モック・オブジェクトの作成が非常に簡単になりました。

 これがどう便利なのか見るために、“Request”および“User”両方の組み込みオブジェクトを使用する以下のようなアクション・メソッドを考えてみましょう(図34)。


図34

 ASP.NET MVCの以前のビルドで上記のアクション・メソッドをテストする場合には、(RouteDataオブジェクトにも持ち込まれる、不明瞭(ふめいりょう)ないくつかのコンストラクタを持った)RequestContextおよびControllerContextをモッキング(mocking)しなければなりません。

 RCビルドでは、(Request.IsAuthenticatedおよびUser.Identity.Nameプロパティがシミュレートできるよう、コントローラに対するControllerContextをモックするためのMoqを使用して)以下のように単体テストが可能です(図35)。


図35

 リファクタリングによる改善は、コントローラのアクションのテストだけでなく、フィルタ、ルータ、独自のActionResult型、そのほかさまざまなシナリオのテストにも役立ちます。

■AccountsController単体テスト

 RCビルドに含まれるASP.NET MVCプロジェクト・テンプレートには、AccountsControllerクラス(これはログインやアカウント管理のシナリオの処理するためにデフォルトでプロジェクトに追加されたコントローラです)の動作を検証する25の単体テストが追加されています。これがAccountsControllerのリファクタリング/更新をより簡単にしました。またAccountsControllerの実装は、もっと簡単に非Membershipプロバイダ・ベースの認証システムの統合をできるように修正されました。

クロス・サイト・リクエスト・フォージェリ(Cross Site Request Forgery:CSRF)の防御

 クロス・サイト・リクエスト・フォージェリ(CSRF)アタック(XSRFアタックともいわれる)は、信頼されたブラウザ・エージェントのユーザーに、サイト上で意図しないアクションを取らせます。これらのアタックは、ユーザーがまだほかのサイトへログインしていることを当てにしています。悪意のあるWebサイトは、元のサイトへのリクエストを作成することにより(例えば、ハッカー・サイト上の<img src=""/>要素を使って、そのサイトのURLへリンクさせることにより)、これを悪用します。そのリクエストは、ユーザーのブラウザを使用して行われるので、そのユーザーの認証トークンや証明書が付いています。アタッカーは、そのユーザーの認証やセッション・クッキーがまだ有効であることを期待し、もしそうだった場合、アタッカーは破壊的な行動を取ることができるのです。このハッキング手法については、ここで詳細を読むことができます。

 ASP.NET MVC RCには現在、いくつかのビルトインのCSRF防御ヘルパーが含まれており、CSRFアタックを緩和する手助けをします。例えば、Html.AntiForgeryTokenヘルパー・メソッドを使用して、フォーム内にhidden inputトークンを描画できます(図36)。


図36

 このヘルパー・メソッドはHTTPクッキーを発行し、フォームにhidden input要素を描画します。悪意のあるWebサイトは両方の値にアクセスすることはできません。

 そして、新しい[ValidateAntiForgeryToken]属性を、防御したいアクション・メソッドに適用できます(図37)。


図37

 これは適切なトークンの存在をチェックし、もしそれらが合致しなければ、HTTP-POSTアクション・メソッドを実行しません(CSRFアタックが成功する機会を減少させます)。

ファイル処理の改善

 ASP.NET MVC RCには、数多くのファイル処理の改善が含まれています。

■FileResultとFileヘルパー・メソッド

 コントローラのアクション・メソッドからファイルが、ActionResultとして返されることを示すために使用される新しいFileResultクラスがRCビルドで追加されました。いまやコントローラの基底クラスは一連のFileヘルパー・メソッドを持っており、それによってFileResultを作成して返すのが簡単になりました。

 例えば、写真管理サイトをビルドしていると仮定しましょう。保存された写真の詳細をカプセル化する以下のような簡単な“Photo”クラスを定義できます(図38)。


図38

 そして、新しいFileヘルパー・メソッドを以下のように使用し、データベースからその写真を取り出して描画するのに使用するPhotoManagerコントロール上で、“DisplayPhoto”アクション・メソッドを実装できます(図39)。以下のコードでは、描画するデータとファイルのMimeタイプもFileヘルパー・メソッドへ渡しています。もし<img src=""/>要素をアクション・メソッドURLで指定した場合、ブラウザはその写真をページ内にインラインで表示します。


図39

 エンドユーザーが写真をダウンロードしてローカルに保存できるようにするには、“DownloadPhoto”アクション・メソッドを以下のように実装します(図40)。以下のコードでは、3つ目のパラメータが渡されており、それによりASP.NET MVCはヘッダを設定して、指定されたファイル名で[名前を付けて保存]ダイアログをブラウザに表示させます。


図40

 ユーザーが/PhotoManager/DowloadPhoto/1232というURLへのリンクをクリックした場合、その写真を保存するためのダイアログが表示されます(図41)。


図41

■ファイル・アップロードのサポート

 RCビルドには、アップロードされたファイルおよびマルチパートのMimeコンテンツに対するビルトインのモデルバインダのサポートも含まれています。

 例えば、enctype属性が“multipart/form-data”に設定された、/PhotoManager/UploadPhotoというURLへ送信を行う<form>を持つことができます。もし<input type="file" name="fileToUpload"/>要素がフォーム内にある場合、エンドユーザーによって選択されたファイルは、HttpPostedFileBaseオブジェクトとしてアクション・メソッドに引き渡されます(図42)。


図42

 そして、HttpPostedFileBaseオブジェクトを使用してアップロードされたファイルの生データやそのMIMEタイプにアクセスでき、またオプションでそれをデータベースやディスクへ保存できます。

AJAXの改善

 ASP.NET MVC RCには、数多くのAJAX改善が含まれています。

■ASP.NET MVCプロジェクト・テンプレート内に含まれているjQueryのIntelliSenseファイル

 新しく作られたASP.NET MVCプロジェクトには、標準のjQueryライブラリ(完全版および圧縮版の両方)、および、それに対してよりリッチなIntelliSenseサポートを提供するためにVisual Studioが使用する「-vsdoc」ドキュメント・ファイルの両方が含まれています(これに関する詳細はここで読むことができます)(図43)。


図43

 これにより、クライアント・スクリプトのブロックやJavaScriptファイルの中で、リッチなjQuery JavaScript IntelliSenseが利用可能になります(図44)。


図44

 本日のRCビルトではjQuery 1.2.6を出荷しています。最終のASP.NET MVC 1.0リリースでは次のjQuery 1.3.1リリースの出荷を予定しており、それ用に更新したJavaScript IntelliSenseファイルが含まれることになっています。

■Request.IsAjaxRequestプロパティ

 Request.IsAjaxRequestプロパティは、リクエストがクライアント上のAJAX呼び出しから送信されたものかどうかを検知するために使用できます(加えて、AJAXが有効でなく適切にグレードダウンする場合にも便利です)。このメソッドのロジックはRCで更新され、現在では(ASP.NET AJAXが送信したフォーム・フィールドに加え)“X-Requested-With”HTTPヘッダを認識します。これはPrototype、jQuery、DojoなどのJavaScriptライブラリが送信する一般的なヘッダで、ASP.NET MVCリクエスト内でAJAXをチェックするために統一された方法が利用可能です。

■JavaScriptResult、ActionResultおよびJavaScriptヘルパー・メソッド

 コントローラの基底クラスは現在、JavaScriptResult型の新しいActionResultクラスを返すJavaScriptヘルパー・メソッドを持っています。これは生のJavaScriptを返す機能をサポートしており、ビルトインのASP.NET MVCヘルパー・メソッドにより、クライアント上で実行されます。サーバのロジックに基づいて、クライアント上で条件付きのJavaScriptを実行したい場合に便利です。

まとめ

 わたしたちはASP.NET MVC V1の最終“ホーム・ストレッチ”(=ゴール前の直線コース)にいることに非常に興奮しています。RCビルドで何か問題を見つけた場合は、すぐにご報告ください。そうしていただければ、最終リリースに向けてそれらを解決することができます。チームは今後数週間、フィードバックを注意深くモニタし、大きな問題が発生しないならば、オフィシャルなV1ビルドを来月出荷する予定にしています。

 Hope this helps,

 ScottEnd of Article

 

 INDEX
  〜ScottGu氏のブログより〜
  ASP.NET MVC 1.0 RC版が公開
    1.Visual Studioのツール改善(1)
    2.Visual Studioのツール改善(2)
    3.ビューの改善/フォーム送信の改善
  4.単体テストの改善/ファイル処理の改善/AJAXの改善
 
インデックス・ページヘ  「〜ScottGu氏のブログより〜」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間