colinramsay.co.uk

Testing Request.Form with ASP.NET MVC

08 Jul 2008

I wanted to quickly spike an idea that I had last night, and while normally I'd use Monorail, I thought it was high time I took an interest in ASP.NET MVC. It took about ten minutes for me to stumble to a halt.

In Monorail, you can do something like this:

public void Save([DataBind("item")]Model model){}

The instance of model will be automatically populated with incoming variables from Request.Form or Request.QueryString. To do similar in ASP.NET MVC, it seems you have to do this:

public void Save()
{
    Model model = new Model();
    BindingHelperExtensions.Binding.UpdateFrom(model, Request.Form, "item");
}

A bit more verbose, but I can live with that. The trouble came when I was thinking about unit testing this (yes, I should have thought about that first if I really wanted to do TDD, bla bla).

In Monorail, a test for the above could look like:

public void SaveTest()
{
    MyController controller = new MyController();
    controller.Save(new Model());
}

Obviously the above doesn't actually do anything, but you get the point. But how would I replicate that with ASP.NET MVC? I can't just pass through a ready-made instance to the Save action. I needed some way to pass through some values to Request.Form so that UpdateFrom would have something to chew on.

Trouble is... there doesn't seem to be a simple way of doing that. I've reviewed a number of blog articles, and even looking at the code for Rob Conery's Storefront which is now linked from the ASP.NET website itself, shows that his solution is to create a fake HttpContextBase class which uses a mock HttpRequestBase.

This being Preview 3, I'd like to think that this process would be streamlined in the near future, but for now, I'll pass.

Feedback or questions on this post? Create an issue on GitHub.