How do I Unit Test Actions without Mocking that use UpdateModel?

后端 未结 3 1711
误落风尘
误落风尘 2020-12-16 04:08

I have been working my way through Scott Guthrie\'s excellent post on ASP.NET MVC Beta 1. In it he shows the improvements made to the UpdateModel method and how they improv

3条回答
  •  眼角桃花
    2020-12-16 04:44

    I don't think it can be done since TryUpdateModel, which UpdateModel uses, references the ControllerContext which is null when invoked from a unit test. I use RhinoMocks to mock or stub the various components needed by the controller.

    var routeData = new RouteData();
    var httpContext = MockRepository.GenerateStub();
    FormCollection formParameters = new FormCollection();
    
    EventController controller = new EventController();
    ControllerContext controllerContext = 
        MockRepository.GenerateStub( httpContext,
                                                        routeData,
                                                        controller );
    controller.ControllerContext = controllerContext;
    
    ViewResult result = controller.Create( formParameters ) as ViewResult;
    
    Assert.AreEqual( "Event", result.Values["controller"] );
    Assert.AreEqual( "Show", result.Values["action"] );
    Assert.AreEqual( 0, result.Values["id"] );
    

    Here's the relevant bit from the Controller.cs source on www.codeplex.com/aspnet:

    protected internal bool TryUpdateModel( ... ) where TModel : class
    {
    
         ....
    
        ModelBindingContext bindingContext =
               new ModelBindingContext( ControllerContext,
                                        valueProvider,
                                        typeof(TModel),
                                        prefix,
                                        () => model,
                                        ModelState,
                                        propertyFilter );
    
         ...
    }
    

提交回复
热议问题