使用自定义模型绑定器对控制器进

时间:2009-11-06 18:54:35

标签: asp.net-mvc unit-testing controller model-binding

在我的应用程序中,我有一个自定义模型绑定器,我在global.asax中设置为DefaultBinder:

 ModelBinders.Binders.DefaultBinder = new XLDataAnnotationsModelBinder();

在为控制器编写单元测试时,我需要确保控制器使用自定义模型绑定器,但我不知道如何执行此操作。

我的测试看起来像这样:

 [Test]
 public void Details_Post_Action_Fails_To_Change_Email_Address_With_Duplicate()
 {
     // Setup
     var controller = new AccountController();
     controller.SetFakeControllerContext();

     var param = Customer.Load(30005);
     param.EmailAddress = "foo@bar.com";

     // Test
     var result = controller.Details(param);

     // Assert
     Assert.IsTrue(result is ViewResult);  // will be ViewResult if failed....
     Assert.IsFalse(((ViewResult)result).ViewData.ModelState.IsValid);
 }

使用此单元测试,控制器最终使用DefaultModelBinder。我可以在此测试中添加什么来确保控制器使用自定义模型绑定器?

1 个答案:

答案 0 :(得分:3)

Scott Hanselman不久前发表了一篇与此相关的博客文章:

Splitting DateTime - Unit Testing ASP.NET MVC Custom Model Binders

您感兴趣的部分位于“测试自定义模型活页夹”下的帖子底部。基本上你实例化一个ModelBindingContext,然后实例化你的Modelbinder并在Modelbinder上调用Bind()传入你创建的ModelBindingContext(如果需要的话还有控制器上下文)。

这是SO的另一个问题,它还包含您需要的信息(即使您没有使用Moq):

How to Unit Test a custom ModelBinder using Moq?