2010-09-01 14 views
5

estoy usando este método de ayuda a convertir mi PartialViewResult en cadena y devolviéndolo como JSON - http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/ASP.NET MVC - Prueba unitaria RenderPartialViewToString() con Moq framework?

Mi problema es que estoy usando Moq para burlarse del controlador, y cada vez que corro prueba de unidad que utiliza este RenderPartialViewToString() método, obtuve la "referencia de objeto no establecida en una instancia de un objeto". error en 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; 
} 

Esto devuelve un controlador proxy, y tal vez es la razón por la que recibí ese error. ¿Alguna idea de cómo probar esta unidad?

Muchas gracias.

+0

Dónde exactamente * * significa el 'NullReferenceException' ocurrir? – bzlm

+0

Ocurre en ControllerContext, creo que debido a que Moq se burla del controlador y solo devuelve el proxy ... Esta es la línea: ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView (ControllerContext, viewName); ControllerContext.Controller es nulo cuando sobre él. Gracias, – Saxman

+0

Obtengo esta excepción también, después de configurar los parámetros "controlador" y "acción" en el RouteData. Rastreo de pila completo: http://pastebin.com/S8c26JLD – EMP

Respuesta

4

probar esto:

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

Hola Omu, tengo este error en esta línea: 'ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView (ControllerContext, viewName);' El error es "The RouteData must contener un elemento llamado 'controlador' con un valor de cadena no vacío. " Gracias. – Saxman

+0

@saxman intente agregarlo – Omu

+0

Lo intenté pero no tuve suerte, el mismo error :(*** Editado *** ¿Cómo agrega manualmente una variable de controlador a RouteData? – Saxman

Cuestiones relacionadas