2017-12-29 45 views
0

私はそうのように見えるウェブアピモデルバインダーを持っています。 NameValueCollectionのが唯一の方法は、MVCに存在し テストウェブアピモデルバインダーは

public TModel BindModel<TBinder, TModel>(NameValueCollection formCollection, TBinder binder) 
     where TBinder : IModelBinder 
    { 
     var valueProvider = new NameValueCollectionValueProvider(formCollection, null); 

     var dataProvider = new DataAnnotationsModelMetadataProvider(); 
     var modelMetadata = dataProvider.GetMetadataForType(null, typeof(TModel)); 

     var bindingContext = new ModelBindingContext 
     { 
      ModelName = typeof(TModel).Name, 
      ValueProvider = valueProvider, 
      ModelMetadata = modelMetadata 
     }; 

     binder.BindModel(null, bindingContext); 
     return (TModel)bindingContext.ModelMetadata.Model; 
    } 

しかしWEBAPIを使用するように変換しようとしたとき、私は値プロバイダーを移入する方法を見つけ出すことはできません。私がMVCのモデルバインダーhereで動作する機能を見つけました

答えて

0

デフォルト値プロバイダを使用せずにモデルバインダーをテストすることはできません。だから私は予想されたルールに基づいて私のバインドモデルを書いた。この場合、私は唯一のテストに必要な

public TModel BindModelFromGet<TBinder, TModel>(string modelName, string queryString, TBinder binder) 
    where TBinder : IModelBinder 
{ 
    var httpControllerContext = new HttpControllerContext(); 
    httpControllerContext.Request = new HttpRequestMessage(HttpMethod.Get, MOCK_URL + queryString); 
    var bindingContext = new ModelBindingContext(); 

    var dataProvider = new DataAnnotationsModelMetadataProvider(); 
    var modelMetadata = dataProvider.GetMetadataForType(null, typeof(TModel)); 

    var httpActionContext = new HttpActionContext(); 
    httpActionContext.ControllerContext = httpControllerContext; 

    var provider = new QueryStringValueProvider(httpActionContext, CultureInfo.InvariantCulture); 

    bindingContext.ModelMetadata = modelMetadata; 
    bindingContext.ValueProvider = provider; 
    bindingContext.ModelName = modelName; 

    if (binder.BindModel(httpActionContext, bindingContext)) 
    { 
     return (TModel)bindingContext.Model; 
    } 

    throw new Exception("Model was not bindable"); 
} 

を取得し、あなたがこの記事のために仕事をしたい場合は、jsonValuesの文字列に取るhttpControllerContextそうのように変更します。

httpControllerContext.Request = new HttpRequestMessage(HttpMethod.Post, ""); 
httpControllerContext.Request.Content = new ObjectContent<object>(jsonValues, new JsonMediaTypeFormatter()); 

その後、あなただけ使用する必要があります適切なValueProvider(私はそれが私にとって不必要なので、どのようにして研究をしなかったのか)。