2011-08-15 11 views
1

私はカスタムモデルバインダーのテストを書こうとしています。私はスタブするのが難しいです。私がオンラインで探しているもののどれもASP.Net Mvc 3に直接関連していないか、または非常に不完全な例がある傾向があります。ASP.Net Mvc 3でModelBindersをテストする方法

具体的には、私が打つ最大の壁はbindingContext.ModelTypeです - これを設定すると、setterが廃止され、Modelパラメータから推測される(実行時)エラーがスローされます。 nullにする必要があります。

答えて

0

Hanselman氏は、ここでは詳細にこれを説明する:

http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx

更新:上記のサンプルは廃止されました。この記事のコメントを読む!

+0

私はこの記事を読んでいて、それはひどく時代遅れです –

+0

実際には私はそれが時代遅れだとは思わない。おそらく最初のもののいくつかが、ユニットテストコードはまだまだ機能しますね。 – ThomasArdal

+0

ValueProviderDictionaryは廃止されており、そこから悪化しています。 Stuffはまったく同じようにバインドされておらず、ModelTypeのようなものはまったく設定できません。このパターンでは私のシナリオ(モックDBからモデルをロードするか、新しいモデルを作成する)を得ることができませんでした。 –

0

Thomas & George、ModelBindingContextに値プロバイダを設定する必要があります。以下は、タイプを作成し、デフォルトモデルのバインダーを使用してオブジェクトを水和させるHomeController Indexアクションのコードの例です。これは単なる単純化されたバージョンです。私のプロダクションコードでは、実際にタイプのコントローラアクションにパラメータを取り込み、そのタイプを動的に作成し、複数のタイプを1つのコントローラアクションに送信する場合に効果的です。 ValueProviderとControllerContextはコントローラのプロパティです。

 HomeModel test = new HomeModel(); 
     ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => test, test.GetType()); 
     ModelBindingContext modelBindingContext = new ModelBindingContext { ModelMetadata = metadata, ValueProvider = ValueProvider}; 


     DefaultModelBinder defaultModelBinder = new DefaultModelBinder(); 
     defaultModelBinder.BindModel(ControllerContext, modelBindingContext); 
+0

しかし、コントローラからValueProviderを選んでいるのですが、これは単体テストでは利用できません。しばらくしています。私はValueProviderを作成しようとしているのを覚えているようで、複雑なパラメータがたくさん必要なので失敗しました。ASP MVCソースユニットテストを調べようとしましたが、ASP MVCがいくつかのクラスを公開するという事実に頼っているようですInternalsVisibleToを使用して単体テストに直接 –

+0

あなた自身のValueProviderFactories.http://blog.approache.com/2011/03/unit-test-actions-withを作成するには、この投稿を参照する必要があります。 html – aBetterGamer

関連する問題