2009-07-30 17 views
6

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.Come prendere in giro il contesto del controller con moq

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<HttpRequestBase>(); 
    request.Setup(r => r.HttpMethod).Returns("GET"); 
    var mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.Setup(c => c.Request).Returns(request.Object); 

    var controllerContext = new ControllerContext(mockHttpContext.Object, 
           new RouteData(), 
           new Mock<ControllerBase>().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); 

Dalla esempi sul web che dimostrano beffardo e anche bene TTD io sono solo confuso su ciò che altri installatori ho bisogno di fare uno di quanto sopra primo esempio di lavoro di unit test.

Cheers,

Andrew

risposta

7

Il motivo del test non riesce è perché ciò che decide il ViewName quando non si specifica uno è esplicitamente nelle profondità del quadro. 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 lo consiglio, è quello di non basarsi sui valori predefiniti e specificare la vista in modo esplicito:

return View("About"); 

Quindi il valore sarà lì per testare senza beffardo nulla:

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

Grazie, dopo aver visto uno dei metodi di firma è View (string viewName, object model) il tuo punto ha perfettamente senso! Post scriptum il test è passato! :-) –

3

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

Si può vedere questo codice sulla linea 68 del ViewResultBase.ExecuteResult entro the MVC source:

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

Inoltre, si dovrebbe essere attenti a ciò che si sta 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). È possibile find a post by Phil Haack concerning just this subject per iniziare.

Problemi correlati