コレといって何も無いですね。あ、本文にはHTMLが入るイメージなのでHTMLエディターをEditorTemplatesで作ってもいいね。今ならMarkdownのほうがオシャレかの~。削除すると、一覧ページに戻るだけ。こんなのを作って、これに対してテストを実施させてみようじゃないですか。実行したいテストは以下の通り。Createを押してモデル検証をエラーにする登録されているすべてのエントリを削除する今回認証は無しで。LabsのProductsトップにあるビデオを確認。ふ~ん、ってなもんです。RCをローカルPCにインストール。これでいいっぽい?う~ん残念。TestをC#で実行できないみたいです。RCサーバーとの通信を行う)を提供、って具合の理解でよろしかろうか。RCはJavaアプリで、Webベースの管理インターフェースもありそこでテスト実行ブラウザやその他設定の変更ができると。IDEが表示してくれる、C#のコードはNUnitを基本になってて、そこはMSTestでよしなに動くようにチョチョッと変更。大枠はTestInitializeでDefaultSeleniumを初期化するようにするのと、TestCleanupでDefaultSeleniumの停止処理、あとはひたすらテスト書く。RCのダウンロードしたアセンブリをテストプロジェクトでは参照設定しとこうね。DefaultSeleniumの1個目と2個目のパラメータはなんじゃらホイ。3個目はブラウザっぽくて4個目がテスト対象アプリのアドレス。RCのサーバーらしい。実際のアプリはポートが20337と、いろいろ仕組みを理解しておかないと~。OnDemandっていうクラウドサービスもあるからね~。上記初期コードを書いておけば、あとはIDEの出してくれるC#コードをコピペっちょ!なんだけど、それだと思ったようなエレメントを指してくれない。実行結果のHTML全体に文字列が含まれてるかをチェックするIsTextPresentなんかを使うのはテストとして成立しないっすよね。SelectorかID指定かXPath指定がオーソドックスな指定の仕方になるかと思うわけです。inを入れないとXPathの取得ってできなかったけど新しいバージョンになって”XPathをコピー”っていう機能が標準で実装されてるじゃないですか。}↑こんな感じで入力値と入力結果を比較してちゃんとHTML的に想定通りの結果が生成されてることをテストコードに書けちゃうのが素晴らしい。これまで自分は一体なにをしてたんだと言いたい。これらテストを実行する時に、MSTest(かReSharperのテストのどっちがそういう仕様なのかは知らないけど)だとテストメソッド名順に実行されるので、テスト内容が直前の実行結果に依存するような場合は、プレフィックスを決めておく必要があったりしそう。テストクラスそのものを分けてしまうのもありだけどね。実行すると、ブラウザが起動してあとは勝手に処理してくれるっす。↑これがFirefoxで実行してるところ。↑こっちがIEで実行してるところ。RCの設定画面が優先、っぽい。何にせよ、初めてのWebアプリのユニットテストとしては好感触。今後も精進していきます。今回のサンプルアプリとテストコードは↓こちらからどうぞ。※ちなみにサンプルアプリ自体のテストコードはないのであしからず。ParametersPhilさんのところで取り上げられてるUrlParameter.Optional。RC2で既に実装されてて、標準のプロジェクトテンプレートが生成するGlobal.asaxのルーティング登録で使われてますね。いう機能なのかはPhilさんが書かれてる通り、Routing登録時に初期値をセットせず、ルーティングデータにキー自体含めなくするためのモノですね。);これまで通りのルーティング登録だと上記のように空文字列を指定したりするところをUrlParameter.Optionalを使って下記のように登録する。);そうすると、デバッグでルートURLにアクセス(~/Home/Indexか何も無しか)すると以下のようなルーティングデータとなりました。id=””とした場合は、ルーティングデータにidが含まれるのに対し、Optionalの場合はキーすら含まれず、controller名とaction名のみです。);ちなみに↑これはダメっす。idがUrlに含まれない限り解決できないから、ちゃんとすべてのパラメータを指定しなくてもアクセスしたい場合には使えないデス。なんとなくRoutingの機能が拡張されたのかな?と思えるところですが、MvcHandlerのProcessRequestInitで呼び出してるRemoveOptionalRoutingParametersがOptionalならRouteDataから削除してるんですね。賢い!これをいじってる時に気がついたんだけど、HtmlHelperにValidation/ValidationForなんてのが追加されてるじゃないですか。何に使うのかいまいちよくわからないな~。FieldValidationMetadataをどうしたいんだろう...。クライアントバリデーションに絡んでんのかな~。ViewContext.FormContext.FieldValidatorsに入るはずなのにViewで実行しても特に変化が見られない。使い方間違ってるのかの。FormContextってそもそも誰ぞな。DataAnnotationsModelValidatorのエラーメッセージが日本語なのはなんでっすかね。MVC2010年2月11日木曜日お試しAdWords1月の初め頃だったような、記憶が曖昧なんですけどGoogleからAdWordsのお試し券5000円分が送られてきました。IT戦記)がAdWordsにブログを広告する実験をしてたのを思い出したので、マネッコマネマネして自分もここのブログを無駄に広告してみようと試してみた。途中で一度キーワードを変更したり、上限クリック単価を上げてみたりと調整したものの、目的もなくやってるもんだからそれがどうしたと自分にツッコむ以外することもない。↑こんな感じの設定にしておいて、5000円使い切るまで放置!にしたかったんだけど請求を後払いにしないとお試しできないらしく、使い切るまで完全放置にするのは難しいみたい。すごく長い期間表示するようにして気がついたら請求額が5000円超えなんてことになったら無駄使いにも程がありすぎるし。数日様子をみて1ヶ月くらいは大丈夫かなと期間は1/10~2/5にセット。2種類の数値クリック数と表示回数を表示したのが↑。見事な相関関係があります。そもそも入札してるキーワードが良くないね。広告をクリックしたいようなコンテンツじゃないし、こんな情報を探してる人なら普通に検索しそう。MVC”で検索して出てくる広告でデベロッパーが欲しいのってコンポーネント的なモノだったり書籍だったり以外ないと思うし、そもそもそんなキーワードで検索するようなリテラシーの人が広告をクリックすること自体が疑わしい。言う訳で全くもって試す内容に失敗したAdWords初体験の巻でした。途中で、ナオキさんに見つかって”クリックしないで!”というやりとりが唯一面白かったところかの~。\4,763結構ギリギリ金額じゃん。RC2が出てるのに関係ない話です。App_Code少し前にエントリされてたけど、ずっと放置してたです。Routesで最初の実装サンプルが出てた話。ファイルをBuildManager.GetCompiledAssemblyで実行時にコンパイル。Routes.cs自体にCacheDependencyでファイルの変更監視をさせておき、csを書き換えた時点で動的にコンパイルしなおす(上記BuildManagerで)。IRouteRegistrar実装がルーティングを登録するようにしておくことで、Global.asaxにルーティング情報を保持しなくて良くなるし、アプリケーションの機能とルーティング情報を分離して、柔軟な環境にできる(Subtextがそうなってるのかね)んですね。CacheDependencyでファイルを監視させるときにFileSystemWatcherを中で使ってて、それがFullTrustじゃないと実行できないから不便だねっていうのがこのエントリの本題みたい。解決方法としてはシンプルに~/App_Code下にRoutes.csをおいて、自分では監視しないようにするところ。しとけば、MediumTrustでも動くんだよと。ASP.NETの仕組みに任せとかばいいじゃんと。BuildManager.GetCompiledAssemblyじゃなくてBuildManager.GetTypeでAppDomainに読み込まれてるTypeを取得(もちろんIRouteRegistrarの実装)して実行すればよろしな流れ。