Pregunta

Estoy probando el marco de MOQ y ahora he golpeado una barrera. La siguiente prueba de unidad falla porque el valor real de la propiedad ViewName es una cadena vacía.

¿Alguien podría indicarme la dirección correcta? ¿Por qué no pasa 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 los ejemplos en la web que demuestran burla y también un buen TTD, estoy confundido en cuanto a qué otras tuberías necesito para hacer que cualquiera de los primeros ejemplos de prueba de unidad anterior funcione.

Saludos,

Andrew

¿Fue útil?

Solución

La razón por la que la prueba está fallando es porque lo que decide el ViewName cuando no especifica uno explícitamente está en las profundidades del marco. Más precisamente en el motor de vista, creo. Entonces, para probar esto tal como está, tendría que burlarse mucho más del proceso de solicitud.

Lo que hago, y recomendaría, es no confiar en los valores predeterminados y especificar la vista explícitamente:

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

Otros consejos

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 en realidad deja la propiedad ViewName como String.Empty hasta que se llama a ExecuteResult () .

Puede ver este código en la línea 68 de ViewResultBase.ExecuteResult dentro de la fuente MVC :

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

Además, debes tener cuidado con lo que estás probando. Como regla general, debe centrarse en probar el código que escribe , no el código del marco. La prueba para asegurarse de que el nombre de la vista por convención se resuelva correctamente es realmente una prueba unitaria para el marco en sí, no una aplicación desarrollada en él.

Si está buscando una buena forma de utilizar el simulacro de MVC, puede probar las rutas (lo que parece ser lo que está tratando de hacer aquí). Puede encontrar una publicación de Phil Haack con respecto a este tema para comenzar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top