2010-09-01 55 views
5

我使用这个辅助方法,把我的PartialViewResult成字符串并返回它作为JSON - http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/ASP.NET MVC - 单元测试与Moq框架RenderPartialViewToString()?

我的问题是,我使用起订量来模拟控制器,每当我运行单元测试使用这个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; 
} 

这将返回一个代理控制器,也许这就是我得到这个错误的原因。任何想法如何进行单元测试?

非常感谢。

+0

其中*究竟*请问'NullReferenceException'发生? – bzlm 2010-09-02 06:52:14

+0

它发生在ControllerContext上,我认为是因为Moq嘲笑控制器并且只返回代理...这是行: ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,viewName); 当我将鼠标悬停在其上时,ControllerContext.Controller为空。 谢谢, – Saxman 2010-09-02 15:55:19

+0

在RouteData中设置“controller”和“action”参数后,我也收到了这个异常。全堆栈跟踪:http://pastebin.com/S8c26JLD – EMP 2011-07-19 11:28:03

回答

4

试试这个:

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); 
     } 
+1

嗨Omu,我在这一行上有这个错误:'ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,viewName);'错误是“RouteData必须包含名为'controller'的项目,其中包含非空字符串值。“谢谢。 – Saxman 2010-09-08 16:09:23

+0

@saxman尝试添加它 – Omu 2010-09-08 16:48:07

+0

我试过但没有运气,同样的错误:(***编辑***如何手动添加一个控制器变量到RouteData? – Saxman 2010-09-08 17:04:44