I am trying to write integration tests for ASP.NET MVC Controllers. In my controllers, I used a helper function to render a Razor view to string which is like this
private string Render(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View,
ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
I used this helper function in Controller actions to render a view to string in return it to AJAX calls like the below action
[HttpPost]
public virtual ActionResult TestAction()
{
var model = GetModel();
var razorViewToString = Render("TestAction", model);
var data = new
{
html = razorViewToString
};
return Json(data, JsonRequestBehavior.AllowGet);
}
I wrote a test for the above action as follow
[Test]
public void TestActionTest()
{
var request = new Mock<HttpRequestBase>();
request.SetupGet(x => x.IsAuthenticated).Returns(true);
var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);
var controller = new Controller();
var routeData = new RouteData();
routeData.Values.Add("controller", "TestController");
routeData.Values.Add("action", "TestAction");
var controllerContext = new ControllerContext(context.Object, routeData, controller);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
controller.ControllerContext = controllerContext;
var result = controller.TestAction();
// assert
}
When I run the code it will come up with this exception:
Apparently it's because that the DisplayMode of ControllerContext is null. I tried to mock it as well but it comes with same error.
How do I render a view in unit test?
Aucun commentaire:
Enregistrer un commentaire