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
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
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