¿Cómo pruebo que las vistas Asp.Net MVC se representan sin excepciones?

Se me ocurrió un pequeño problema en mi aplicación.

Cambié el espacio de nombres de mi aplicación principal para que sea de MyApp.Models a MyApp.ViewModels para que los espacios de nombres fueran menos confusos en general (ya que ese espacio de nombres solo tiene modelos de vista y no modelos de negocio). Cambié todas las referencias que pude encontrar, incluso en mis vistas, y volví a ejecutar todas mis pruebas unitarias y revisé la aplicación, y todo parecía estar bien.

Unos días más tarde recibí un informe de que la página de registro tenía un error cuando se abría. Después de mirar, resulta que olvidé arreglar el espacio de nombres en la página de registro y, por lo tanto, no se pudo compilar la vista.

Eso me preocupa. El objetivo de las pruebas unitarias, y uno de los mayores atractivos de Asp.Net MVC, es poder tener confianza en su aplicación al hacer que todo se pruebe individualmente de forma automática para que sepa inmediatamente cuándo su modificación rompe partes del sistema. Las vistas en este momento parecen un gran agujero en esto.

Para ser claros, sé que puede activar la compilación previa de vistas. Sin embargo, no me gusta esta opción ya que no es una buena idea tener esto encendido todo el tiempo (ya que hace que la compilación de una nueva compilación sea muy, muy lenta), y tener un esquema de configuración separado para esto significa que depende del usuario recuerde intentar compilar con ese esquema de configuración para comprobar si hay errores de compilación de vistas.

Esto también evita por completo la verificación de errores de tiempo de ejecución que puedan ocurrir. Por ejemplo, digamos que cambia el modelo de vista que espera una vista fuertemente tipada. Luego, actualizaría la prueba unitaria para asegurarse de que el Controller.Action() está devolviendo un resultado de vista con el tipo de modelo de vista correcto, pero eso no hace nada para asegurarse de que la vista real se haya actualizado correctamente para la nueva vista y, sin embargo, este escenario provocará una excepción en tiempo de ejecución. Este es un escenario fácil de ocurrir, especialmente porque si las diferencias en los dos modelos de vista solo se ven en los parciales usados ​​dentro de la vista.

Otros ejemplos de código que pueden causar excepciones en tiempo de ejecución en las vistas son bucles incorrectos (posiblemente causados ​​por cambios en un modelo de vista), código que verifica el rol de un usuario (por lo que los botones solo se muestran para usuarios con credenciales), conversiones incorrectas (por ejemplo, para convertir un colección en una lista de selección), código incorrecto para ordenar una colección (la forma en que se ordena una colección en la pantalla puede interpretarse como un problema de vista, no un problema de controlador o modelo de vista), si las cadenas utilizadas para la ubicación de archivos no funcionan correctamente (T4MVC no se integra bien con algunas cosas, como el sistema de registro de scripts de Telerik), etc.

A mi modo de ver, hay muchas cosas que pueden hacer que se produzca una excepción en el proceso de renderización de una vista, y parece que no puedo encontrar ninguna forma de crear pruebas unitarias o de integración para determinar cuándo ocurren. Me sentiría más cómodo si no tuviera que revisar todas las páginas para asegurarme de que me perdí un tiempo de compilación o un error de tiempo de ejecución para algo que una prueba unitaria estándar debería poder detectar.

¿Qué opciones tengo para hacer esto?

Preferiría mantenerme alejado de WaTiN y otras herramientas de prueba de GUI, ya que para esto no estoy interesado en la visualización real de la página, solo quiero saber si la vista se representa o si ocurre una excepción y no necesito la sobrecarga de Watin ejecuta una instancia de IE para cada prueba (también creo que esto causará problemas si sigo con la integración continua en un momento posterior).

preguntado el 16 de mayo de 11 a las 19:05

2 Respuestas

Si no desea usar WaTIN e IE, ¿qué tal si inicia su sitio web en IIS Express y luego usa HttpWebRequest sobre cada una de las URL de sus Vistas para verificar que el resultado sea 200 OK. Esta es una prueba de integración completa.

De lo contrario, debe obtener el ViewResult desde su controlador, y llame al ExecuteResult método pasando en un ControllerContext que contiene un trozo HttpContextBase. Esto proporciona una prueba unitaria más real, y sería más rápido, pero tienes que hacer muchas burlas y tachaduras antes de que funcione.

contestado el 16 de mayo de 11 a las 23:05

Ah, no me di cuenta de la ExecuteResult método en ViewResult. ¡Lo investigaré! - KallDrexx

Después de profundizar en los intentos de pruebas unitarias ViewResult.ExecuteResult(), Me he rendido. Algo en el ViewResult.FindView() El código proporciona una excepción de referencia nula en lo más profundo del marco. Supongo que su primera opción es la mejor (o la más fácil de implementar). Encontré un código para hacer esto en reimers.dk/blogs/jacob_reimers_weblog/archive/2010/11/10/… - KallDrexx

Mala suerte. Tengo la sensación de que lo intenté y fracasé. ASP.NET simplemente no está diseñado para ser burlado. Siempre he usado pruebas WaTIN simples, pero si todo lo que necesita es una prueba simple de éxito / falla, HttpWebRequest or HttpClient debería quedarte bien. - Tim Rogers

Sí, eso parece. Aunque parece que HttpWebRequests será difícil cuando esté involucrada la autenticación de formularios. Voy a dejar de hacer esto por un tiempo. - KallDrexx

contestado el 16 de mayo de 11 a las 23:05

Aquellos parecen probar que el controlador está llamando a la vista con un tipo de modelo específico, pero no tiene comprobaciones de que la vista realmente lo esté esperando como modelo. - KallDrexx

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