mardi 5 avril 2016

ASP.NET MVC Render View In Unit Test

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:

enter image description here

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