我正在尝试为我的控制器创建一个单元测试,但是我正在测试的操作使用了字符串函数的部分视图,该函数不想在我的测试中工作。
private string RenderPartialViewToString(string viewName, object model = null)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
这给了我一个错误“对象引用未设置到对象的实例”ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
我在控制器单元测试中的设置是(删除了一些位以简化它):
var mock = new Mock<ControllerContext>();
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
if (userName != null)
{
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
mock.SetupGet(p => p.HttpContext.User.Identity.IsAuthenticated).Returns(true);
}
else
{
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(false);
}
var controller = new BlogController();
controller.ControllerContext = mock.Object;
我没有运气尝试找到解决方案或解决方法。任何帮助表示赞赏。谢谢。
正如所建议的,我已尝试设置路线数据,但仍然收到错误。这是我添加的内容:
var routeData = new RouteData();
routeData.Values.Add("controller", "BlogController");
mock.SetupGet(m => m.RouteData).Returns(routeData);