我如何模拟控制器上下文在我的单元测试,使我对字符串函数的局部视图的作品? [英] How do I mock controller context in my unit test so that my partial view to string function works?

查看:127
本文介绍了我如何模拟控制器上下文在我的单元测试,使我对字符串函数的局部视图的作品?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图给我的控制器创建单元测试,但我测试操作使用哪个不希望在我的测试工作字符串函数的局部视图。

 私人字符串RenderPartialViewToString(字符串的viewName,对象模型= NULL)
{
如果(string.IsNullOrEmpty(的viewName))
的viewName = ControllerContext .RouteData.GetRequiredString(行动);

ViewData.Model =模型;使用

(System.IO.StringWriter SW =新System.IO.StringWriter())
{
ViewEngineResult的ViewResult = ViewEngines.Engines.FindPartialView(ControllerContext,的viewName);
ViewContext viewContext =新ViewContext(ControllerContext,viewResult.View,ViewData的,TempData的,SW);
viewResult.View.Render(viewContext,SW);

返回sw.GetStringBuilder()的ToString()。
}
}

这给我的对象引用错误没有设置就行 ViewEngineResult的ViewResult = ViewEngines.Engines.FindPartialView(ControllerContext,的viewName)的对象的一个实例;



我在控制器的单元测试设置(有几个比特拆下来简化它):

  VAR模拟=新的模拟< ControllerContext>(); 
mock.SetupGet(P => p.HttpContext.User.Identity.Name).Returns(用户名);
如果(用户名!= NULL)
{
mock.SetupGet(P => p.HttpContext.Request.IsAuthenticated).Returns(真);
mock.SetupGet(P => p.HttpContext.User.Identity.IsAuthenticated).Returns(真);
}
,否则
{
mock.SetupGet(P => p.HttpContext.Request.IsAuthenticated).Returns(假);
}
无功控制器=新BlogController();
controller.ControllerContext = mock.Object;



我已经没有任何运气试图找到一个解决方案或解决。任何帮助表示赞赏。谢谢你。






的建议我已经尝试设置路由数据,但仍然得到错误。这是我补充的内容:

  VAR的RouteData =新的RouteData(); 
routeData.Values.Add(控制器,BlogController);
mock.SetupGet(M = GT; m.RouteData).Returns(的RouteData);


解决方案

最后的解决方案感谢帮助的意见。

  VAR模拟=新模拟< ControllerContext>(); 
mock.SetupGet(P => p.HttpContext.User.Identity.Name).Returns(用户名);
如果(用户名!= NULL)
{
mock.SetupGet(P => p.HttpContext.Request.IsAuthenticated).Returns(真);
mock.SetupGet(P => p.HttpContext.User.Identity.IsAuthenticated).Returns(真);
}
,否则
{
mock.SetupGet(P => p.HttpContext.Request.IsAuthenticated).Returns(假);
}

变种的RouteData =新的RouteData();
routeData.Values.Add(控制器,BlogController);
mock.SetupGet(M = GT; m.RouteData).Returns(的RouteData);

VAR视图=新的模拟<&IVIEW GT;();
变种引擎=新模拟< IViewEngine>();
变种viewEngineResult =新ViewEngineResult(view.Object,engine.Object);
engine.Setup(E => e.FindPartialView(It.IsAny< ControllerContext>(),It.IsAny<串>(),It.IsAny<布尔>()))。返回(viewEngineResult);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(engine.Object);

无功控制器=新BlogController();
controller.ControllerContext = mock.Object;


I am attempting to create a unit test for my controller, but the action I am testing uses a partial view to string function which doesn't want to work in my tests.

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

This gives me an error of "Object reference not set to an instance of an object" on the line ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);

My setup in the unit test for the controller is (with a few bits removed to simplify it):

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;

I've not had any luck trying to find a solution or work around. Any help appreciated. Thanks.


As suggested I have tried setting up route data but still getting the error. This is what I have added:

var routeData = new RouteData();
routeData.Values.Add("controller", "BlogController");
mock.SetupGet(m => m.RouteData).Returns(routeData);

解决方案

Final solution thanks to help in the comments.

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 routeData = new RouteData();
routeData.Values.Add("controller", "BlogController");
mock.SetupGet(m => m.RouteData).Returns(routeData);

var view = new Mock<IView>();
var engine = new Mock<IViewEngine>();
var viewEngineResult = new ViewEngineResult(view.Object, engine.Object);
engine.Setup(e => e.FindPartialView(It.IsAny<ControllerContext>(), It.IsAny<string>(), It.IsAny<bool>())).Returns(viewEngineResult);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(engine.Object);

var controller = new BlogController();
controller.ControllerContext = mock.Object;

这篇关于我如何模拟控制器上下文在我的单元测试,使我对字符串函数的局部视图的作品?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆