【问题标题】:ASP.NET MVC - Unit testing RenderPartialViewToString() with Moq framework?ASP.NET MVC - 使用 Moq 框架对 RenderPartialViewToString() 进行单元测试?
【发布时间】:2010-09-01 20:35:02
【问题描述】:

我正在使用这个辅助方法将我的 PartialViewResult 转换为字符串并将其返回为 Json - http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/

我的问题是我使用 Moq 来模拟控制器,并且每当我运行使用此 RenderPartialViewToString() 方法的单元测试时,我都会得到“对象引用未设置为对象的实例”。 ControllerContext 上的错误。

private ProgramsController GetController()
{
var mockHttpContext = new Mock<ControllerContext>();
mockHttpContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("test");
mockHttpContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
// Mock Repositories
var mockOrganizationRepository = new MockOrganizationRepository(MockData.MockOrganizationsData());
var mockIRenderPartial = new BaseController();
var controller = new ProgramsController(mockOrganizationRepository, mockIRenderPartial);
controller.ControllerContext = mockHttpContext.Object;
return controller;
}

这会返回一个代理控制器,也许这就是我收到该错误的原因。知道如何对此进行单元测试吗?

非常感谢。

【问题讨论】:

  • NullReferenceException 出现在哪里确切
  • 它发生在 ControllerContext 上,我认为因为 Moq 正在模拟控制器并且只返回代理......这是行: ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);当我将鼠标悬停在 ControllerContext.Controller 上时,它为空。谢谢,
  • 在 RouteData 中设置“controller”和“action”参数后,我也遇到了这个异常。完整堆栈跟踪:pastebin.com/S8c26JLD

标签: asp.net-mvc unit-testing asp.net-mvc-2 moq


【解决方案1】:

试试这个:

public static void SetContext(this Controller controller)
        {
            var httpContextBase = new Mock<HttpContextBase>();
            var httpRequestBase = new Mock<HttpRequestBase>();
            var respone = new Mock<HttpResponseBase>();
            var session = new Mock<HttpSessionStateBase>();
            var routes = new RouteCollection();
            RouteConfigurator.RegisterRoutesTo(routes);

            httpContextBase.Setup(x => x.Response).Returns(respone.Object);
            httpContextBase.Setup(x => x.Request).Returns(httpRequestBase.Object);
            httpContextBase.Setup(x => x.Session).Returns(session.Object);
            session.Setup(x => x["somesessionkey"]).Returns("value");
            httpRequestBase.Setup(x => x.Form).Returns(new NameValueCollection());
            controller.ControllerContext = new ControllerContext(httpContextBase.Object, new RouteData(), controller);
            controller.Url = new UrlHelper(new RequestContext(controller.HttpContext, new RouteData()), routes);
        }

【讨论】:

  • 嗨 Omu,我在这一行遇到了这个错误:ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 错误是“RouteData 必须包含一个名为 'controller' 且具有非空字符串值的项目。”谢谢。
  • 我试过但没有运气,同样的错误:( *** 已编辑 *** 如何手动将控制器变量添加到 RouteData?
  • 在这两行之间添加你的东西: var routes = new RouteCollection(); RouteConfigurator.RegisterRoutesTo(routes);
  • 你在使用一些自定义的 ViewEngine 吗?
  • 不,我正在使用 MVC ViewEngine,以及将视图呈现为字符串的方法。我不确定问题出在哪里。
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 2012-10-19
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多