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

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 improve unit testing. I have recreated a similar project however anytime I run a UnitTest that contains a call to UpdateModel I receive an ArgumentNullException naming the controllerContext parameter.

Here's the relevant bits, starting with my model:

public class Country {
  public Int32 ID { get; set; }
  public String Name { get; set; }
  public String Iso3166 { get; set; }

The controller action:

public ActionResult Edit(Int32 id, FormCollection form)
  using ( ModelBindingDataContext db = new ModelBindingDataContext() ) {
    Country country = db.Countries.Where(c => c.CountryID == id).SingleOrDefault();

    try {
      UpdateModel(country, form);


      return RedirectToAction("Index");
    catch {
      return View(country);

And finally my unit test that's failing:

public void Edit()
  CountryController controller = new CountryController();
  FormCollection form = new FormCollection();
  form.Add("Name", "Canada");
  form.Add("Iso3166", "CA");

  var result = controller.Edit(2 /*Canada*/, form) as RedirectToRouteResult;

  Assert.IsNotNull(result, "Expected to be redirected on successful POST.");
  Assert.AreEqual("Show", result.RouteName, "Expected to redirect to the View action.");

ArgumentNullException is thrown by the call to UpdateModel with the message "Value cannot be null. Parameter name: controllerContext". I'm assuming that somewhere the UpdateModel requires the System.Web.Mvc.ControllerContext which isn't present during execution of the test.

I'm also assuming that I'm doing something wrong somewhere and just need to pointed in the right direction.

Help Please!


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<HttpContextBase>();
FormCollection formParameters = new FormCollection();

EventController controller = new EventController();
ControllerContext controllerContext = 
    MockRepository.GenerateStub<ControllerContext>( httpContext,
                                                    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

protected internal bool TryUpdateModel<TModel>( ... ) where TModel : class


    ModelBindingContext bindingContext =
           new ModelBindingContext( ControllerContext,
                                    () => model,
                                    propertyFilter );


Need Your Help

Rotating a path for a CAAnimation

objective-c path rotation caanimation

I'm animating some stuff using CAAnimation, &amp; it involves making a fairly complex path using CGPathAddCurveToPoint, maybe 10 - 15 of these per path. Is there a way, instead of recalculating every

Javascript (Mobile) - Lazy Load Images with Jquery

javascript jquery

I'm using the Lazy Load Jquery plugin for a mobile app I'm writing. The plugin works well enough except for the issue that it doesn't detect images that are in the view after the page loads. Here's...