2011-11-10 12 views
8

Voglio testare (unità) la funzione System.Web.Mvc.ViewEngines.Engines.FindPartialView e verificare il corretto ritorno del codice HTML.Testare la funzione "System.Web.Mvc.ViewEngines.Engines.FindPartialView"

Ma ogni volta che avvio il test dell'unità, viene generata un'eccezione "Object reference not set to an instance of an object".

Ho provato a eseguire il debug attraverso il .net framework source ma il debugger si disorienta e salta in modo casuale/interrompe senza messaggi.

Ora voglio sapere quale elemento mi sono perso nello FakeControllerContext e come risolverlo.

Ecco il mio codice:

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

Ed ecco la mia prova:

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

Per la beffarda ho usato Rhino.Mocks e il MvcFakes da Stephenwalther.com

+1

Forse sta cercando di leggere 'HttpContext.Current' dal thread che non verrà impostato. Perché vuoi testare questo? Prova a scaricare la sorgente MVC: dovresti trovare il test di unità esistente di Microsoft. – Rup

+0

Ho una visione per un articolo. Questa vista viene utilizzata per il sito Web e per le e-mail con la raccomandazione di un articolo. Ma c'è una piccola differenza nell'html tra queste due chiamate. Ora voglio scrivere un test che controlla la vista per queste due chiamate. Forse non ho trovato il giusto test di unità nei file di progetto mvc, ma non ho un test che rende l'html – user1039490

risposta

1

Penso che this thread può aiutare tu, devi prendere in giro il ViewEngine quindi prendere in giro la chiamata FindPartialView.

+2

IIRC è la chiamata FindPartialView in cui è intestato - vuole prendere in giro abbastanza delle classi circostanti in modo che possa eseguire il vero codice di FindPartialView, non deriderlo. – Rup

Problemi correlati