¿Cómo verificar que la llamada de una acción a View () no haya arrojado una excepción?

Si golpeamos SomeController.SomeAction() pero el archivo SomeAction.cshtml no se encuentra, obtenemos un System.InvalidOperationException y el mensaje de error de salida ...

No se encontró la vista 'SomeAction' o su maestra o ningún motor de vista admite las ubicaciones buscadas. Se buscaron las siguientes ubicaciones: ... etc

Sin embargo, incluso si falta este archivo, la prueba siguiente pasará como un Ver resultado todavía está siendo devuelto.

¿Cuál es la mejor manera de verificar la llamada de la acción a View() no ha lanzado una excepción y silenciosamente devolvió esto en Ver resultado contenido?


public class SomeController: Controller
{
    public ActionResult SomeAction()
    {
        var viewModel = new SomeModel();
        return View(viewModel);
    }
}

[Test]
public void TestIndex(Type clientType)
{
    var controller = new SomeController();
    var result = (ViewResult)controller.SomeAction();

    Assert.That(result, Is.TypeOf<ViewResult>());
}

NOTA: Este es un ejemplo trivial de un problema mayor, hay una buena razón para realizar este tipo de prueba en este momento, pero este no es el foro para esa discusión.

preguntado el 08 de noviembre de 11 a las 16:11

¿Quizás si eliminas el elenco de ViewResult? -

Some additional context: Algunas personalizaciones del motor de vista significan que el código anterior buscará dinámicamente en el árbol de Vistas basándose en el código que no se muestra y hay cientos de posibles permutaciones del árbol de búsqueda. -

2 Respuestas

En mi opinión, no debería intentar afirmar si existe una vista en la prueba unitaria para una acción del controlador. Lo que necesita probar es el comportamiento de la acción del controlador, que en este caso es bastante simple, como debería ser. Entonces tendrías pruebas para:

  • Acción devuelve la vista predeterminada;
  • La acción pasa el modelo correcto para la vista.

Además, como nota al margen, si tiene una prueba que arroja el resultado de la acción a ViewResult también puede ser explícito al respecto y cambiar el tipo de retorno de la acción. Este cambio hace que su código sea más claro y también elimina la necesidad de la prueba de muestra que presentó, que tiene un error, ya que si la transmisión falla, no se alcanza el código de aserción y si la transmisión tiene éxito, la aserción es redundante.

respondido 08 nov., 11:20

Le agradezco que se haya tomado el tiempo de proporcionar información, pero hay una buena razón para realizar este tipo de prueba en este momento. Algunas personalizaciones del motor de visualización significan que el código anterior buscará en el árbol Vistas de forma dinámica basándose en el código que no se muestra y hay cientos de posibles permutaciones del árbol de búsqueda. - gingerbreadboy

Luego, debe realizar una prueba unitaria de las personalizaciones del motor de vista por separado de las pruebas de la unidad del controlador y probablemente también realizar pruebas de integración para asegurarse de que cualquier posible permutación generada tenga una vista correspondiente definida. - João Angelo

La arquitectura es la arquitectura, el requisito de prueba viene de arriba. Yo solo trabajo aquí;) - gingerbreadboy

Por lo general, asegurarse de que el código de vista se ejecute sin errores es responsabilidad de las pruebas de IU, no de las pruebas unitarias. Podrías intentar usar el FindView método, sin embargo. Solo tendría que simular un ControllerContext para imitar la solicitud Http que pretende realizar.

También puede estar interesado en la última versión de Resharper, que es bastante buena para alertarlo cuando el código de su controlador se refiere a una Vista que no existe.

respondido 08 nov., 11:20

Algunas personalizaciones del motor de visualización significan que el código anterior buscará en el árbol Vistas de forma dinámica basándose en el código que no se muestra y hay cientos de posibles permutaciones del árbol de búsqueda. Desafortunadamente, Resharper no puede ayudarnos aquí, por increíble que sea :) - gingerbreadboy

@runrunraygun: ¿Evitará eso que el método FindView funcione? - StriplingGuerrero

Voy a intentar hacer una simulación de ControllerContext y ver cómo funciona. Informaré cuando esté hecho. - gingerbreadboy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.