I hope this question gives some interesting answers because it's one that's bugged me for a while.
Is there any real value in unit testing a controller in ASP.NET MVC?
What I mean by that is, most of the time, (and I'm no genius), my controller methods are, even at their most complex something like this:
public ActionResult Create(MyModel model)
{
// start error list
var errors = new List<string>();
// check model state based on data annotations
if(ModelState.IsValid)
{
// call a service method
if(this._myService.CreateNew(model, Request.UserHostAddress, ref errors))
{
// all is well, data is saved,
// so tell the user they are brilliant
return View("_Success");
}
}
// add errors to model state
errors.ForEach(e => ModelState.AddModelError("", e));
// return view
return View(model);
}
Most of the heavy-lifting is done by either the MVC pipeline or my service library.
So maybe questions to ask might be:
- what would be the value of unit testing this method?
- would it not break on
Request.UserHostAddress
andModelState
with a NullReferenceException? Should I try to mock these? - if I refractor this method into a re-useable "helper" (which I probably should, considering how many times I do it!), would testing that even be worthwhile when all I'm really testing is mostly the "pipeline" which, presumably, has been tested to within an inch of it's life by Microsoft?
I think my point really is, doing the following seems utterly pointless and wrong
[TestMethod]
public void Test_Home_Index()
{
var controller = new HomeController();
var expected = "Index";
var actual = ((ViewResult)controller.Index()).ViewName;
Assert.AreEqual(expected, actual);
}
Obviously I'm being obtuse with this exaggeratedly pointless example, but does anybody have any wisdom to add here?
Looking forward to it... Thanks.