tags:

views:

109

answers:

2

I want to write a unit test to ensure that the view I am returning is the correct one.

My plan is to write a test that first invokes the controller and then calls the ActionResult method I plan to test I thought I could write something like

Controller controller = new HomeController();
var actionresult = controller.Index();
Assert.False(actionresult.ToString(), String.Empty);

which would then allow me to parse the actionresult for the test value. However I cannot directly instantiate the public ActionResult Index() method.

How do I do this?

+3  A: 

The test helpers in MVCContrib will help you here.

ViewResult result = controller.Index().AssertViewRendered().ForView("Blah");
IainMH
+1  A: 

Here's an example from Professional ASP.NET MVC 1.0 (book):


[TestMethod]
public void AboutReturnsAboutView()
{
     HomeController controller = new HomeController();
     ViewResult result = controller.About() as ViewResult;

     Assert.AreEqual("About", result.ViewName);
}

Note that this will fail if you don't return an explicit view in your controller method, i.e. do this:


     Return(View("About"));

not this:


     Return(View());

Or the test won't pass. You should only need to do this if your method will ever return more than one view, otherwise you should return an implicit view anyway and not bother testing the framework.

mgroves
Testing out your code, it should be ViewResult result = controller.About() as ViewResult;no 's', but it is looking good so far. Will award this answer as correct if it works when I finish
Nissan
Yeah sorry, that was a typo. It's hard to copy and paste from an actual book :)
mgroves