Come deridere il contesto del controller con moq

Sto provando il framework MOQ e ora ho raggiunto una barriera. Il seguente test dell’unità non riesce perché il valore effettivo della proprietà ViewName è una stringa vuota.

Qualcuno potrebbe indicarmi la direzione giusta per favore perché questo non sta superando il test?

[TestMethod] public void Can_Navigate_To_About_Page() { var request = new Mock(); request.Setup(r => r.HttpMethod).Returns("GET"); var mockHttpContext = new Mock(); mockHttpContext.Setup(c => c.Request).Returns(request.Object); var controllerContext = new ControllerContext(mockHttpContext.Object, new RouteData(), new Mock().Object); var controller = new HomeController(); controller.ControllerContext = controllerContext; var result = controller.About() as ViewResult; Assert.AreEqual("About", result.ViewName); } 

Quanto segue produce anche un ViewName vuoto.

  HomeController controller = new HomeController(); ViewResult result = controller.About() as ViewResult; Assert.IsNotNull(result); Assert.AreEqual("About", result.ViewName); 

Dagli esempi sul web che dimostrano il beffeggiamento e anche il buon TTD, sono solo confuso su quale altro impianto idraulico debba essere utilizzato per eseguire uno dei suddetti test esemplificativi della prima unità.

Saluti,

Andrea

Il motivo per cui il test ha esito negativo è perché ciò che decide il ViewName quando non lo si specifica esplicitamente è nelle profondità del framework. Più precisamente nel motore della vista, credo. Quindi, per testarlo così com’è, dovresti prendere in giro molto più della pipeline della richiesta.

Quello che faccio e che consiglierei è di non fare affidamento sui valori predefiniti e specificare esplicitamente la vista:

 return View("About"); 

Quindi il valore sarà lì per testare senza prendere in giro nulla:

 var controller = new HomeController(); var result = controller.About() as ViewResult; Assert.AreEqual("About", result.ViewName); 

Questo perché stai facendo delle ipotesi su come funziona il framework MVC. Se si fa affidamento sulle convenzioni per individuare la vista, il framework lascia in realtà la proprietà ViewName come String.Empty fino a quando viene chiamato ExecuteResult() .

Puoi vedere questo codice nella riga 68 di ViewResultBase.ExecuteResult all’interno della sorgente MVC :

 if (String.IsNullOrEmpty(ViewName)) { ViewName = context.RouteData.GetRequiredString("action"); } 

Inoltre, dovresti fare attenzione a ciò che stai testando. Come regola generale, dovresti concentrarti sul test del codice che scrivi , non sul codice del framework. Il test per assicurarsi che il nome della vista per convenzione sia risolto correttamente è in realtà un test unitario per il framework stesso, non un’applicazione creata su di esso.

Se stai cercando un buon modo di impiegare il mocking in MVC, potresti voler esaminare i tuoi percorsi (che assomigliano a quello che stai cercando di fare qui). Puoi trovare un post di Phil Haack riguardante proprio questo argomento per iniziare.