2009-07-30 14 views
6

Estoy probando el marco MOQ y hasta ahora he topado con una barrera. La siguiente prueba unitaria falla porque el valor real de la propiedad ViewName es una cadena vacía.Cómo simular el contexto del controlador con moq

¿Alguien podría indicarme en la dirección correcta por qué esto no está pasando la prueba?

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

Lo siguiente también produce un ViewName vacío.

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

De ejemplos en la web que demuestran burlas y también es bueno TTD ya solo queda confundido en cuanto a qué otras tuberías que necesito para hacer cualquiera de la primera prueba de la unidad de trabajo ejemplo anterior.

Saludos,

Andrew

Respuesta

7

La razón por la que la prueba está fallando es porque lo decide el ViewName cuando ni especificar una es explícita en lo más profundo de la estructura. Más precisamente en el motor de visualización, creo. Entonces, para probar esto tal como está, tendrías que burlarte mucho más de la tubería de solicitud.

lo que hago, y lo recomiendo, es que no se basan en los valores por defecto y especificar el punto de vista de manera explícita:

return View("About"); 

Entonces, el valor estará allí para probar sin burlarse de nada:

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

Gracias, después de ver que una de las firmas de método es Ver (string viewName, modelo de objeto) ¡su punto tiene mucho sentido! PD. la prueba pasó! :-) –

3

Esto se debe a que está haciendo suposiciones sobre cómo funciona el marco MVC. Si confía en las convenciones para ubicar la vista, el marco realmente deja la propiedad ViewName como String.Empty hasta que se llame al ExecuteResult().

Se puede ver este código en la línea 68 de ViewResultBase.ExecuteResult dentro the MVC source:

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

Por otra parte, se debe tener cuidado con lo que está probando. Como regla general, debe concentrarse en probar el código que escribe, no el código del marco. Las pruebas para asegurarse de que el nombre de vista por convención se resuelva correctamente es realmente una prueba unitaria para el marco en sí, no una aplicación basada en él.

Si está buscando una buena manera de emplear el burlarse en MVC, es posible que desee comprobar sus rutas (que se parece a lo que está tratando de hacer aquí). Puede find a post by Phil Haack concerning just this subject para comenzar.

Cuestiones relacionadas