RSpec: ¿Cuál es la diferencia entre una función y una especificación de solicitud?

113

¿Cuál es la diferencia conceptual entre RSpec de especificaciones de características y de solicitud de especificaciones ?

De los documentos de especificaciones de funciones:

Las especificaciones de funciones son pruebas de alto nivel destinadas a ejercitar partes de la funcionalidad a través de una aplicación. Deben manejar la aplicación solo a través de su interfaz externa, generalmente páginas web.

Y para especificaciones de solicitud:

Las especificaciones de solicitud proporcionan un envoltorio delgado alrededor de las pruebas de integración de Rails y están diseñadas para impulsar el comportamiento a través de la pila completa, incluido el enrutamiento (proporcionado por Rails) y sin apéndices (eso depende de usted). Con las especificaciones de solicitud, puede:

  • especificar una sola solicitud
  • especificar múltiples solicitudes a través de múltiples controladores
  • especificar varias solicitudes en varias sesiones

Sé que las especificaciones de funciones usan Capybara y las especificaciones de solicitud no. Pero eso no amerita conceptos diferentes.

daño
fuente

Respuestas:

147

La diferencia conceptual es que normalmente se prueba una historia de usuario y toda la interacción debe realizarse a través de la interfaz de usuario. Ahí es donde entra Capybara. Una especificación de solicitud todavía está probando el comportamiento de su aplicación y no tiene la expectativa de legibilidad que tendría una prueba de aceptación. Entonces, la característica está ahí para la sintaxis mejorada para las pruebas de aceptación.

Las diferencias técnicas incluyen las especificaciones de solicitud para las pruebas de integración de Rails, mientras que las especificaciones de funciones no. Esto significa que con las especificaciones de solicitud puede usar los métodos get, post, put, delete y afirmar contra la respuesta. Con las especificaciones de funciones, debe impulsar toda la interacción a través del navegador y utilizar métodos como visitar y hacer valer contra la página.

Recomendaría leer feature_spec.feature en el código fuente de rspec-rails en github. Espero que esto ayude.

Richard Jordan
fuente
2
Entonces, ¿recomendaría usar tanto las especificaciones de características como las de solicitud, o es suficiente una u otra? (Ser nuevo en TDD ...)
robertwbradford
2
Yo uso ambos, @robertwbradford. Utilizo especificaciones de funciones para impulsar mi exterior en las pruebas: probar la experiencia del usuario y luego desarrollar la funcionalidad mediante pruebas unitarias. Utilizo especificaciones de solicitud para probar respuestas; por ejemplo, en un session_spec, puedo tener un "GET /login"bloque de descripción con expectativas en itbloques como expect(response.status).to eq(200)y expect(response).to render_template(:new), o en describe "POST /sessions"un context "with valid credentials"bloque, con expect(response).to redirect_to(user)yfollow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan
5
¿Y también usas especificaciones de controlador? Parece que hay un poco de duplicación entre lo que prueba en las especificaciones de solicitud y lo que normalmente se prueba en las especificaciones del controlador.
Ernesto
5
Dicho esto, la publicación vinculada anteriormente describe claramente las diferencias. Use especificaciones de solicitud para probar a través de API, use especificaciones de funciones para probar a través de frontend.
Damien Roche
2
@RichardJordan: Una pregunta: en las especificaciones de funciones, ¿recomendaría utilizar rutas de Rails (es decir visit users_path) o cadenas codificadas ( visit '/users')? Personalmente, prefiero no utilizar ningún componente interno de la aplicación en ese tipo de especificaciones.
tokland