¿Cómo ejecuta un único archivo de prueba / especificación en RSpec?

282

Quiero poder ejecutar las pruebas de un solo archivo de especificaciones, por ejemplo, para el único archivo que estoy editando. rake specejecuta todas las especificaciones. Mi proyecto no es un proyecto Rails, por lo rake spec:docque no funciona.

No sé si esto importa, pero aquí está mi estructura de directorios.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./Especificaciones
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb
Jonathan Tran
fuente

Respuestas:

392

O puede omitir el rastrillo y usar el comando 'rspec':

rspec path/to/spec/file.rb

En su caso, creo que siempre que su archivo ./spec/db_spec.rb incluya los ayudantes apropiados, debería funcionar bien.

Si está utilizando una versión anterior de rspec es:

spec path/to/spec/file.rb
Cameron Booth
fuente
31
con el nuevo rspec tienes que usar "rspec path / to / file.rb"
djburdick
3
Tal vez lo estoy haciendo mal, pero tengo que hacer "bundle exec rspec path / to / spec / file.rb"
andrhamm
2
Si está utilizando Rails, es probable que desee ejecutar sus especificaciones utilizando Rake para asegurarse de que está comenzando desde una base de datos en blanco.
superluminario
@andrhamm, solo está ejecutando sus especificaciones en el contexto de su paquete. Esto es necesario si no está utilizando gemas (que vienen por defecto con rvm, y son una extensión separada de rbenv)
Caleb
66
Si desea ejecutar solo una prueba, agregue el número de línea del inicio de la prueba al archivo. Ejemplo: rspec ruta / a / spec / file.rb: 455
runamok
201

La invocación en bruto:

especificación de rastrillo SPEC = spec / controllers / sessions_controller_spec.rb \
          SPEC_OPTS = "- e \" debe iniciar sesión con cookie \ ""

Ahora descubra cómo incrustar esto en su editor.

mislav
fuente
1
Como dije, no estoy en rieles, así que no hay controladores. Pero sí, "rake spec SPEC = file.rb" funciona. ¡Gracias! Estoy trabajando en la integración de Emacs ahora.
Jonathan Tran
55
No inicies el rakefile si puedes evitarlo. Se necesitan edades jodidas
Orion Edwards
2
Cambié la respuesta aceptada, pero el parámetro SPEC_OPTS también me fue útil.
Jonathan Tran
2
Eso es lo que yo llamo una buena respuesta. ¿Por qué no está marcado como "Respuesta"?
gmile
1
Ejecutar especificaciones directamente es a menudo la mejor opción, pero hay muchas ocasiones en las que tienes que ejecutar rastrillo para varios fragmentos mágicos en un archivo de rastrillo personalizado
Nerdmaster
124

Esta pregunta es antigua, pero aparece en la parte superior de Google cuando se busca cómo ejecutar una sola prueba. No sé si es una adición reciente, pero para ejecutar una sola prueba fuera de una especificación, puede hacer lo siguiente:

rspec path/to/spec:<line number>

donde -número de línea- es un número de línea que contiene parte de su prueba. Por ejemplo, si tuviera una especificación como:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Digamos que está guardado en spec / models / foo_spec.rb. Entonces correrás:

rspec spec/models/foo_spec.rb:2

y solo ejecutaría esa especificación. De hecho, ese número podría ser de 2 a 5.

¡Espero que esto ayude!

juanpaco
fuente
Esto es interesante, aunque parece que no funciona una vez que refactoriza su especificación en varios archivos (es decir, solo puede usarla con el archivo _spec.rb principal, pero si ninguno de sus ejemplos está en ella, no se ejecutará nada Además, si intenta usarlo para un archivo que no es un archivo de especificaciones de nivel superior, tampoco se ejecutará nada.)
Trejkaz
No entiendo del todo. ¿Qué quiere decir con "archivo de especificaciones de nivel superior"? Mi conjunto de pruebas casi siempre está dividido en varios archivos, y siempre puedo invocar pruebas en un solo archivo usando este método. ¿Te refieres a tener un archivo que sea requiretu otro archivo de especificaciones?
juanpaco
Puedo usar esto en cualquier archivo en cualquier nivel bajo el directorio spec /. Creo que Trejkaz es incorrecto.
Michael Durrant
77
¡Esto es increíble y debería estar en la cima!
Tommaso Barbugli
44
Lo uso todo el tiempo, pero a veces quieres ejecutar varias pruebas desde un archivo. Luego puede escribir todos los ejemplos como este:rspec spec/models/foo_spec.rb:2:12:49
swilgosz
61

También puede usar el texto real del caso de prueba * e * xample con -e!

Entonces para:

it "shows the plane arrival time"

puedes usar

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

No hay necesidad de rastrillo aquí.

tcurdt
fuente
Esto es todo lo que necesita, excepto que "spec" debe reemplazarse por "rspec" como se indica @bandhunt
Nicolas Wormser
19

de ayuda (spec -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Ejemplo: spec spec / runner_spec.rb -l 162

boblin
fuente
3
En las versiones más recientes de Rspec, agrega el número de línea después de dos puntos :según la documentación y una respuesta popular.
dragon788
13

Si instaló rspec como un complemento en lugar de como una gema, entonces no tendrá el specejecutable.

En cualquier caso, todo lo que necesita hacer es ejecutar el archivo con ruby. El código rspec es lo suficientemente inteligente como para ejecutar las pruebas por usted.

p.ej:

ruby myclass_spec.rb
Orion Edwards
fuente
2
¿Es posible ejecutar una prueba dentro del archivo como esta?
Ian Vaughan
12

http://github.com/grosser/single_test te permite hacer cosas como ...

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last
Zeke
fuente
Parece que la gema no se ha mantenido, ¡la última confirmación fue hace 5 años!
thegreendroid
10

Ruby 1.9.2 y Rails 3 tienen una manera fácil de ejecutar un archivo de especificaciones:

  ruby-I spec spec / models / user_spec.rb

Explicación:

  • rubyel comando tiende a ser más rápido que el rakecomando
  • -I spec significa "incluir el directorio 'spec' cuando busque archivos"
  • spec/models/user_spec.rb es el archivo que queremos ejecutar.
joelparkerhenderson
fuente
¿Puedes ejecutar una prueba dentro de ese archivo con algunas opciones adicionales?
Ian Vaughan
10

Para ejecutar todos sus archivos rspec:rspec

nota: debes estar en la raíz de tu proyecto

Para ejecutar un archivo rspec:rspec 'path_to/spec.rb'

nota: reemplace 'path_to / spec.rb' con su ruta. Comillas opcionales.

Para ejecutar una prueba rspec desde un archivo:rspec 'path_to/spec.rb:7'

nota:: 7 es el número de línea donde comienza la prueba

nflauria
fuente
5

Estaba teniendo problemas para que alguno de estos ejemplos funcione, ¿tal vez porque la publicación es antigua y los comandos han cambiado?

Después de hurgar un poco, encontré que esto funciona:

rspec spec / models / user_spec.rb

Eso ejecutará solo el archivo único y proporciona resultados útiles en el terminal.

Greg Hemphill
fuente
Esto fue mencionado en un comentario en la respuesta aceptada. Sí, creo que esta publicación es tan antigua que el nombre del comando ha cambiado.
Jonathan Tran
3

Alternativamente, eche un vistazo a la prueba automática.

La ejecución de la prueba automática en una ventana de comandos significará que el archivo de especificaciones se ejecutará cada vez que lo guarde. Además, se ejecutará siempre que se ejecute el archivo que está especificando.

Por ejemplo, si tiene un archivo de especificación de modelo llamado person_spec.rb, y un archivo de modelo que especifica se llama person.rb, cada vez que guarde cualquiera de estos archivos desde su editor, el archivo de especificación se ejecutará.

fatgeekuk
fuente
3

Aunque se escribieron muchas respuestas excelentes a esta pregunta, ninguna de ellas utiliza el enfoque Rspectags .

Utilizo etiquetas para ejecutar una o más especificaciones en diferentes archivos, solo aquellas relacionadas con mi tarea de desarrollo actual.

Por ejemplo, agrego la etiqueta "dev" con el valor "actual":

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

entonces corro

bundle exec rspec . --tag dev:current

Se pueden establecer diferentes etiquetas / valores en especificaciones individuales o grupos.

Victor BV
fuente
2

Digamos que estás ejecutando una prueba para crear todo. Siempre puede ejecutar ese código de especificación de tarea específica utilizando el archivo crete_spec.rb como se muestra a continuación.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Si desea ejecutar todas las especificaciones en un solo corto.

   rspec 

Si desea ejecutar todas las especificaciones en un usuario controlador específico esto.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

¡Espero que te dé más comprensión!

Prabhakar Undurthi
fuente