シナリオ我々は新しいMVC Webプロジェクトを開発していると、この記事で説明したように、私たちはスキニーControllerパターンに準拠しようとしているモッキングのHttpContext **外**コントローラーの
http://codebetter.com/iancooper/2008/12/03/the-fat-controller/
私たちの行動の一環として、キャッシュからいくつかのナビゲーションデータ(メニュー構造)を取得しています。
問題私たちは私たちが試みていると私たちは次のコードを使用して、作品を知っているViewModelに、キャッシュ・チェック・コールをしたいのですスキニーコントローラパターンを維持するために
。
var cachedCategories = (List<Category>)HttpContext.Current.Cache["Categories"];
if (cachedCategories == null) {
cachedCategories = _service.GetCategories().ToList<Category>();
HttpContext.Current.Cache["Categories"] = cachedCategories;
}
ただし、単体テストになると問題が発生します。 がHttpContextをViewModelに渡すのではないので、HttpContextをどうやって嘲笑うかわからない。
私たちはMoqを使用していますが、いくつかのオプションがあります(1つはインスタンシエーション時にコントローラのコンテキストをviewmodelに渡すものです)。これらのオプションでは、テストを動作させるためにコードを変更する必要があります。
誰にも提案はありますか?
ローカル変数に割り当てることができるコントローラにプロパティを設定できます。nullの場合はHttpContect.Currentが割り当てられ、HttpContextBaseが返され、テストからHttpContextBaseを割り当てることができます。それが意味をなさないならば。 – Phill
IoCフレームワークを使用している場合、自動的にHttpContext.CurrentをHttpContextBaseプロパティ(またはコンストラクタ)に割り当てることができます。フィールドまたは自動プロパティを持つことができます。 (私が思うには、ブログの投稿がこれに当たると思う;)) – Phill
テスト目的のためだけにプロパティを追加することは、私たちが思いついたオプションの1つですが、それをやりたいとは思いません。純粋にテストのためにコードを追加するのを避けようとしています。 – Morgeh