2011-07-26 19 views
12

Esto me tomó por sorpresa ...RSpec compartió ejemplos no deben ser compartidos

Parece que no se puede utilizar el mismo nombre para 2 rspec compartida ejemplo, los grupos en cualquier lugar dentro de su proyecto. Si lo hace, cuando ejecuta rake spec (para ejecutar todas las especificaciones), rspec se queja de que un grupo de ejemplo compartido fue declarado con un nombre no único.

Esto ocurre incluso cuando las llamadas a shared_examples_for están contenidas dentro de un bloque de descripción (se presumiría que debería abarcar los ejemplos).

Al principio traté de evitar esto cambiando los nombres de los grupos de ejemplo (no es ideal, pero puedo vivir con él).

Pero esto se convirtió en un problema mayor cuando quería factorizar el grupo de ejemplo en un archivo separado para poder compartirlo entre múltiples archivos de especificaciones.

Las especificaciones funcionan bien cuando se ejecutan de forma aislada, pero cuando ejecuto el paquete, rspec se queja.

`ensure_shared_example_group_name_not_taken': \ 
Shared example group 'a person' already exists (ArgumentError) 

Sin duda, este es un problema común.

¿Hay algo que me falta aquí?

Respuesta

11

A partir de rspec 2.6, los ejemplos compartidos son globales. Puede declararlos en un grupo de ejemplo, pero no tienen un alcance para ese grupo.

+0

Gracias David. ¿Alguna recomendación sobre cómo usar ejemplos compartidos en más de un archivo de especificación? Parece que llamar 'shared_examples_for' fuera de un bloque' describe' hace que 'rake' falle. –

+0

Lo siento. Eso no es cierto. Falla incluso cuando lo envuelvo en 'describe'. Aparentemente tiene que ver con requerir otro archivo. –

+4

La intención es definirlos en un archivo y usarlos en otros archivos, por lo que definitivamente debería funcionar si los tiene en un archivo diferente. La convención es mantenerlos en un archivo bajo especificaciones/soporte (por ejemplo, spec/support/shared_examples_for_xyz.rb) y requerir esos archivos desde spec/spec_helper.rb. –

2

Hay algunos consejos en la documentación oficial sobre la mejor manera de manejar esto:

https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples

TL; DR

Sí, ejemplos compartidos son globales. Práctica recomendada para Ruby On Rails: coloque ejemplos compartidos en spec/support/foo_bar_shared_examples.rb y simplemente comience a escribir shared_example directamente, sin ajustar en ningún bloque describe ni de otro modo.

Cuestiones relacionadas