2009-11-30 18 views
1

我正在嘗試爲我的自定義模型綁定器創建一個測試,但沒有任何成功。對base.BindModel的調用總是返回null。有沒有辦法在使用LINQ to Entities時測試自定義綁定?在這種情況下,foo是帶有兩個字段的數據庫中的表格 - 數字和文本值。asp.net mvc和linq to entities:如何測試模型的自定義綁定?

fooBinder.cs:

public override Object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    var obj = (foo)base.BindModel(controllerContext, bindingContext); 
    return obj; 
} 

我試圖做一個簡單的測試(有一個在這裏一些額外的碎片,我已經嘗試了許多不同的方法):

fooBinderTest.cs :

fooBinder binder; 
ControllerContext controllerContext; 
ModelBindingContext bindingContext; 

[TestInitialize] 
public void Initialize() 
{ 
    controllerContext = MockControllerContext().Object; 

    FormCollection form = new FormCollection 
     { 
     {"foo_A","2" }, 
     {"foo_B", "FooB" } 
     }; 
    var valueProvider = form.ToValueProvider(); 

    bindingContext = new ModelBindingContext() 
    { 
    ModelState = new ModelStateDictionary(), 
    ModelType = typeof(foo), 
    ModelName = "foo", 
    ValueProvider = valueProvider 
    }; 

    binder = new fooBinder(); 

} 

public static Mock<ControllerContext> MockControllerContext() 
{ 
    var context = new Mock<ControllerContext>(); 
    var sessionState = new Mock<HttpSessionStateBase>(); 
    var response = new Mock<HttpResponseBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var serverUtility = new Mock<HttpServerUtilityBase>(); 

    var form = new FormCollection 
     { 
     {"foo_A","2" }, 
     {"foo_B", "FooB" } 
     }; 

    context.Setup(c => c.HttpContext.Session).Returns(sessionState.Object); 
    context.Setup(c => c.HttpContext.Response).Returns(response.Object); 
    context.Setup(c => c.HttpContext.Request).Returns(request.Object); 
    context.Setup(c => c.HttpContext.Server).Returns(serverUtility.Object); 
    context.Setup(c => c.HttpContext.User.Identity.Name).Returns("Test"); 
    context.Setup(c => c.HttpContext.Request.Form).Returns(form); 

    return context; 
} 


[TestMethod] 
public void TestDefault() 
{ 
    foo myFoo = (foo)binder.BindModel(controllerContext, bindingContext); 
    Assert.IsNotNull(myFoo); 
} 

回答

1

L2E在這裏是紅鯡魚。

您必須指定自定義模型聯編程序,因爲您沒有在測試中運行MVC基礎結構。

下面是我如何做到這一點(MVC 2; 1有點不同)。

internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) 
    { 
     var mbc = new ModelBindingContext() 
     { 
      ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T)), 
      ModelName = prefix, 
      ModelState = modelState, 
      ValueProvider = collection.ToValueProvider() 
     }; 
     IModelBinder binder = new MyCustomModelModelBinder(); 
     var cc = new ControllerContext(); 

     return binder.BindModel(cc, mbc) as T; 
    } 

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) 
    { 
     var msd = new ModelStateDictionary(); 
     var result = Bind<T>(prefix, collection, msd); 
     if (!msd.IsValid) 
     { 
      Assert.Fail(ModelStateValidationSummary(msd)); 
     } 
     return result; 
    } 
+0

不幸的是,我們正在使用MVC 1. – chris 2009-11-30 18:45:04

+0

您可以在MVC 1上做幾乎完全相同的事情;只有在構建ModelBindingContext時所設置的屬性發生變化。 – 2009-11-30 19:13:26

+0

IIRC你設置'Model'而不是'ModelMetadata'。但已經有一段時間了。 – 2009-11-30 19:25:06