¿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

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

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.


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!


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í.


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


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

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

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.

¿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


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.


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

4

specky.vim


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á.


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.


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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.