2011-11-10 18 views
8

Quiero (unidad) probar la función System.Web.Mvc.ViewEngines.Engines.FindPartialView y verificar la devolución correcta del código HTML.Pruebe la función "System.Web.Mvc.ViewEngines.Engines.FindPartialView"

Pero cada vez que comienzo la prueba de la unidad, arroja una excepción "Object reference not set to an instance of an object".

He intentado depurar a través de la fuente de .NET Framework, pero el depurador se desorienta y salta al azar/se rompe sin mensaje.

Ahora quiero saber qué elemento me he perdido en el FakeControllerContext y cómo solucionarlo.

Aquí es mi Código:

public static string RenderPartialViewToString(string viewName, object model, ControllerContext controller) 
{ 
    if (string.IsNullOrEmpty(viewName)) 
     viewName = controller.RouteData.GetRequiredString("action"); 

    controller.Controller.ViewData.Model = model; 

    using (var sw = new StringWriter()) 
    { 
     //"Error: ***.Shop.UnitTests.RenderStuffTest.RenderPartialViewToStringTest-Test method threw an exception: System.NullReferenceException – Object reference not set to an instance of an object" 
     ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller, viewName); 
     controller.Controller.ViewData.Model = model; 
     controller.Controller.ViewBag.Part = true; 

     var viewContext = new ViewContext(controller, viewResult.View, controller.Controller.ViewData, 
             controller.Controller.TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 

Y aquí está mi prueba:

[TestMethod] 
    public void RenderPartialViewToStringTest() 
    { 
      const string viewName = "_navi"; 
      var customersController = new ArticleController(); 
      customersController.ControllerContext = new FakeControllerContext(customersController)          {               RouteData = 
                 { 
                  Route = 
                   new Route(
                   "{language}/{controller}/{action}/{id}", 
                   new MvcRouteHandler()) 
                  , 
                  RouteHandler = new MvcRouteHandler() 
                 }, 
               }; 

      customersController.ControllerContext.RouteData.Values.Add("language", "German"); 
      customersController.ControllerContext.RouteData.Values.Add("controller", "Article"); 
      customersController.ControllerContext.RouteData.Values.Add("action", "Index"); 
      customersController.ControllerContext.RouteData.Values.Add("id", ""); 
      var model = (...); 
      string actual = RenderStuff.RenderPartialViewToString(viewName, model, customersController.ControllerContext); 
      (...) 
     } 

Para la burla que he usado Rhino.Mocks y la MvcFakes de Stephenwalther.com

+1

Quizás esté intentando leer 'HttpContext.Current' del subproceso que no se establecerá. ¿Por qué quieres probar esta unidad? Intente descargar la fuente de MVC: debería encontrar allí la prueba de unidad existente de Microsoft. – Rup

+0

Tengo una vista para un artículo. Esta vista se usa para el sitio web y para correos electrónicos con recomendación de artículo. Pero hay poca diferencia en el html entre estas dos llamadas. Ahora quiero escribir una prueba que verifique la vista para estas dos llamadas. Quizás no encontré la prueba de unidad correcta en los archivos de proyecto mvc, pero no recibo una prueba que realmente represente el html – user1039490

Respuesta

1

Creo que this thread puede ayudar usted, tiene que burlarse del ViewEngine y luego burlarse de la llamada FindPartialView.

+2

IIRC es la llamada FindPartialView que ha probado - quiere burlarse de las clases de los alrededores para que pueda ejecutar el código real FindPartialView, no simularlo. – Rup

Cuestiones relacionadas