2011-01-29 16 views
9

Estoy probando el motor MVC3 Razor view, y una de las características que estoy explorando es la posibilidad de probar vistas de unidades.Pruebas unitarias MVC3 Razor helpers/views without strings

He visto una serie de ejemplos donde las vistas Razor se pueden compilar en un ensamblado y se pueden representar en una cadena. El problema es que se presenta como una cadena, ¡así que me queda hacer búsquedas de cadenas!

Esto es lo que estoy tratando de hacer.

  1. Crear un ayudante Razor
  2. Compilar ayudante
  3. Run ayudante compilado, pasando en un modelo de vista
  4. Obtener la salida del ayudante como una especie de estructura/XML/árbol HTML

La razón por la que quiero hacer esto es para poder probar partes específicas de la salida. Es probable que el ayudante escupir HTML que incluye varios residuos de salida. Lo que quiero hacer es ver si hay una casilla de verificación con un valor particular (por ejemplo). Si ha visto las pruebas de Selenium, es similar a lo que me gustaría hacer, excepto que no son pruebas controladas por el servidor.

¿Hay alguna manera de obtener vistas compiladas Razor (u otro motor de vista) para emitir algo distinto de cadenas de caracteres?

Respuesta

4

La respuesta corta es no, porque el propósito de los motores de vista en la vida es escupir cadenas. Analizar esas cadenas en un documento XML es una forma de darles un poco de estructura, como sugirió @ Craig-M. Pero lo que tienes que preguntarte es lo que realmente estás probando. Si su vista compila y genera algún tipo de HTML, puede haber tres problemas con lo que generó:

  • los datos que muestra no son correctos. Debería probar esto en el nivel del controlador, por lo que puede ignorarlo durante la prueba de visualización.
  • el framework MVC tenía un error y generaba una cadena HTML incorrecta. No se preocupe por esto, porque MVC tiene su propio conjunto de pruebas y, gracias a la separación de las preocupaciones, no es su problema.
  • el HTML ha roto la interfaz de usuario.

Que la última sería muy agradable de probar, pero ¿por qué no probarla en las pruebas de javascript unitarias? Eche un vistazo a las populares suites de prueba de javascript como JsUnit, FireUnit, QUnit, etc. Todas harían un trabajo mucho mejor de lo que podría hacer al analizar la salida de Razor.

Creo que el valor asignado a una casilla de verificación probablemente se probaría en las pruebas del Controlador. Pero para usar su ejemplo, probar el valor de su casilla de verificación podría ser $ ('# theCheck'). Val() == 'the value'. Y puede ejecutarlos contra un sitio web que se ejecuta con repositorios o servicios de dependencia inyectada para controlar cosas como 'el valor'.

Solo un pensamiento.

+0

Gracias por la excelente respuesta. La razón para probar en el nivel de HTML es probar la lógica en la vista. Por ejemplo, si paso un ViewModel que contiene productos y tiene una propiedad en stock. Si un producto tiene stock == 0, no muestre un enlace de compra. Más tarde, agrego lógica en ViewModel para garantizar que los productos nunca tengan stock == 0, sino que usen IsInStock. propiedad. Quiero una prueba que fallará debido a que no produce el HTML correcto. Una forma de escribir esta prueba es construir un ViewModel legítimo, pasarlo a la vista y verificar que el enlace no se haya generado. ¿Tener sentido? Gracias, –

+0

Sí, sigo. Comprobar que el enlace existe en QUnit sería algo simple como: prueba ("testing for link", function() { ok ($ ('# myLink'). Length == 1, "enlace presente"); }); – Milimetric

1

Una forma de hacerlo es analizar la cadena html en un XDocument y hacer que su ensamblaje lo devuelva. Entonces puede consultar contra esto con LINQ en sus pruebas.

Editar: Estoy tratando de averiguar una estrategia de prueba Razor también. Me interesaría saber cómo logras que el ayudante trabaje. Hasta el momento, estoy haciendo un espacio en blanco para hacer que se procesen en cadenas fuera del marco de MVC.

+0

Esa es la dirección que voy ahora. Incluso con Razor, es un poco complicado crear todas las dependencias funcionando correctamente (por ejemplo, TempData) para probar una vista. Podría ver otros motores de visualización, pero creo que ASP.NET MVC es el problema. ¡Avísame si progresas! Gracias –

+0

Pasé dos días probando diferentes métodos para obtener las vistas representadas en una cadena. Sin suerte hasta ahora. Cada ruta se encontró con algún tipo de resistencia, como la necesidad de instanciar una clase interna o no poder usar los ayudantes de MVC. Como ya estamos haciendo pruebas de WebAii en este proyecto, me quedé sin tiempo para hacerlo funcionar y tuve que abandonar mi esfuerzo. Sin embargo, estoy muy interesado en hacer esto en mis propios proyectos y definitivamente volveré a publicar aquí si encuentro una solución. –

+0

Un poco tarde, pero publiqué partes para obtener un arnés de prueba de la unidad de trabajo para las vistas de Razor en la siguiente pregunta: http://stackoverflow.com/questions/8720222/how-do-i-test-views-using-razor- sintaxis-en-mvc3 – Lucero

1

¿Qué le parece pasar sus vistas a html y luego enviar ese html a la biblioteca HtmlAgility? De esa forma, puede recorrer/navegar fácilmente su html. No creo que haya ninguna manera de hacer eso con MVC.

+0

Esta es la dirección que terminé yendo. Con el aumento de HTML5, parece que esperar un XML real va a ser un problema más adelante. –