【问题标题】:ASP.NET MVC Render View In Unit Test单元测试中的 ASP.NET MVC 渲染视图
【发布时间】:2016-04-05 11:10:03
【问题描述】:

我正在尝试为 ASP.NET MVC 控制器编写集成测试。在我的控制器中,我使用辅助函数将 Razor 视图呈现为字符串,如下所示

        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();
        }
    }

我在控制器动作中使用了这个辅助函数来将视图呈现为字符串,然后将其返回给 AJAX 调用,如下面的动作

    [HttpPost]
    public virtual ActionResult TestAction()
    {
        var model = GetModel(); 
        var razorViewToString = Render("TestAction", model);
        var data = new
        {
            html = razorViewToString
        };
        return Json(data, JsonRequestBehavior.AllowGet);
    }

我为上述动作写了一个测试如下

    [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
    }

当我运行代码时,它会出现这个异常:

显然是因为ControllerContext的DisplayMode为null。我也试图模拟它,但它也有同样的错误。

如何在单元测试中渲染视图?

【问题讨论】:

    标签: asp.net-mvc unit-testing razor


    【解决方案1】:
    ViewResult result = controller.TestAction() as ViewResult;
    

    然后试试result.View.Render()

    【讨论】:

    • controller.TestAction() 自己执行渲染并将其作为 JSON 返回。当我在浏览器中运行应用程序时它可以工作,但在单元测试中不起作用。
    • 因为此时您有一个 ViewResult 会将其内容呈现给响应。 Request lifecycle
    • 我是说 TestAction 不返回 ViewResult
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多