Mocking HtmlHelper throws NullReferenceException
- by Matt Austin
I know that there are a few questions on StackOverflow on this topic but I haven't been able to get any of the suggestions to work for me. I've been banging my head against this for two days now so its time to ask for help...
The following code snippit is a simplified unit test to demonstrate what I'm trying to do, which is basically call RadioButtonFor in the Microsoft.Web.Mvc assembly in a unit test.
var model = new SendMessageModel
{
SendMessageType = SendMessageType.Member
};
var vd = new ViewDataDictionary(model);
vd.TemplateInfo = new TemplateInfo { HtmlFieldPrefix = string.Empty };
var controllerContext = new ControllerContext(new Mock<HttpContextBase>().Object,
new RouteData(),
new Mock<ControllerBase>().Object);
var viewContext = new Mock<ViewContext>(new object[] { controllerContext, new Mock<IView>().Object, vd, new TempDataDictionary(), new Mock<TextWriter>().Object });
viewContext.Setup(v => v.View).Returns(new Mock<IView>().Object);
viewContext.Setup(v => v.ViewData).Returns(vd).Callback(() => {throw new Exception("ViewData extracted");});
viewContext.Setup(v => v.TempData).Returns(new TempDataDictionary());
viewContext.Setup(v => v.Writer).Returns(new Mock<TextWriter>().Object);
viewContext.Setup(v => v.RouteData).Returns(new RouteData());
viewContext.Setup(v => v.HttpContext).Returns(new Mock<HttpContextBase>().Object);
viewContext.Setup(v => v.Controller).Returns(new Mock<ControllerBase>().Object);
viewContext.Setup(v => v.FormContext).Returns(new FormContext());
var mockContainer = new Mock<IViewDataContainer>();
mockContainer.Setup(x => x.ViewData).Returns(vd);
var helper = new HtmlHelper<ISendMessageModel>(viewContext.Object, mockContainer.Object, new RouteCollection());
helper.RadioButtonFor(m => m.SendMessageType, "Member", cssClass: "selector");
If I remove the cssClass parameter then the code works ok but fails consistently when adding additional parameters.
I've tried every combination of mocking, instantiating concrete types and using fakes that I can think off but I always get a NullReferenceException when I call RadioButtonFor. Any help hugely appreciated!!