【发布时间】: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