¿Cómo ejecutar una sola prueba RSpec?

306

Tengo el siguiente archivo:

/spec/controllers/groups_controller_spec.rb

¿Qué comando en la terminal utilizo para ejecutar solo esa especificación y en qué directorio ejecuto el comando?

Mi archivo de gemas:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Archivo de especificaciones:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end
Un aprendiz
fuente
Puede ejecutar sus pruebas como bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, solo ejecuta esta prueba específica. Más información aquí: kolosek.com/rails-rspec-setup
Nesha Zoric
bundle exec rspec spec --helpte daré la respuesta:
Thomas Decaux

Respuestas:

15

No estoy seguro de cuánto tiempo ha estado disponible, pero hay una configuración Rspec para ejecutar el filtrado, por lo que ahora puede agregar esto a su spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

Y luego agregue una etiqueta de enfoque al it, contexto describepara ejecutar solo ese bloque:

it 'runs a test', :focus do
  ...test code
end

Documentación de RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method

emc
fuente
1
Esto requiere una infraestructura cambiante. Y recordando cambiarlo de nuevo. Recomendaría no hacer esto y usar solo los rspeccomandos para ejecutar la especificación con el parámetro apropiado para indicar cuál
Michael Durrant
482

Usualmente hago:

rspec ./spec/controllers/groups_controller_spec.rb:42

Donde 42representa la línea de la prueba que quiero ejecutar.

EDITAR1:

También puedes usar etiquetas. Ver aquí .

EDITAR 2:

Tratar:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
apneadiving
fuente
Gracias intenté que no funciona cuando rastrillo spec /spec/path...:XX me sale el error /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice
Si intento usar solo RSPEC, me sale este error: "$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : en `setup ': ya ha activado rspec-core 2.6.2, pero su Gemfile requiere rspec-core 2.6.0. Considere usar el paquete exec. (Gem :: LoadError)"
AnApprentice
Puede probar "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19" en ese caso
muffinista
paquete ejecutivo funcionó pero ¿por qué? ¿Es un truco alguna forma de evitar eso?
AnApprentice
11
no es un truco, se asegura de que uses la misma versión que declaraste en tu archivo de gemas. En su caso, el mero rspecerror porque la versión en su sistema es más reciente que la de su archivo de gemas.
Apneadiving
67

Con rastrillo:

rake spec SPEC=path/to/spec.rb

(El crédito va a esta respuesta . Ve a votarlo).

EDITAR (gracias a @cirosantilli): para ejecutar un escenario específico dentro de la especificación, debe proporcionar una coincidencia de patrón de expresiones regulares que coincida con la descripción.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""
Grant Birchmeier
fuente
11
Esta es la respuesta superior porque usa el comando 'rake spec' no el comando 'rspec'. Eso significa que la base de datos de prueba se reinicia correctamente cada vez (lo que no sucede si usa 'rspec ...')
jpw
Puede usar SPEC=path/to/spec.rb:42para ejecutar la prueba en el número de línea dado, aunque parece que cualquier it_behaves_likeprueba también se ejecutará (¿error?).
mgold
61

Puede pasar una expresión regular al comando spec que solo ejecutará itbloques que coincidan con el nombre que proporcione.

spec path/to/my_spec.rb -e "should be the correct answer"

Actualización de 2019: Rspec2 cambió del comando 'spec' al comando 'rspec'.

Douglas F Shearer
fuente
Gracias. Intenté eso, pero tiene errores con: $ rake spec spec / controllers / coming_mails_controller_spec.rb -e "debería tener éxito y devolver 3 elementos". (eval): 1: en `standard_rake_options ': error de compilación (eval): 1: error de sintaxis, tIDENTIFIER inesperado, esperando que $ end sea exitoso y devuelva 3 elementos
AnApprentice
Actualizado con las ideas de archivo de especificaciones reales?
AnApprentice
Si tiene un error de compilación, su especificación no es válida ruby. Asegúrese de que no se echa en falta una dotras una it, contexto describedeclaración.
Douglas F Shearer
1
Es "especificación", no "especificación de rastrillo".
muffinista
esta debería ser la respuesta correcta, ya que un número de línea está muy mal, en cualquier caso
Eugen Mayer
27

Hay muchas opciones:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true
Michael Durrant
fuente
23

Mi método preferido para ejecutar pruebas específicas es ligeramente diferente: agregué las líneas

  RSpec.configure do |config|
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end

A mi archivo spec_helper.

Ahora, cada vez que quiera ejecutar una prueba específica (o contexto, o especificación), simplemente puedo agregarle la etiqueta "foco" y ejecutar mi prueba de manera normal, solo se ejecutarán las pruebas enfocadas. Si elimino todas las etiquetas de enfoque, elrun_all_when_everything_filtered activa y ejecuta todas las pruebas de forma normal.

No es tan rápido y fácil como las opciones de la línea de comandos: requiere que edite el archivo para la prueba que desea ejecutar. Pero creo que te da mucho más control.

GlifoGrifo
fuente
Definitivamente prefiero este estilo, porque comúnmente estoy ejecutando pruebas a través de Rubymine / intelliJ. También me gusta este método porque es similar a usar fit / xit en jazmín / con trago
wired00
9

La respuesta de @apneadiving es una buena manera de resolver esto. Sin embargo, ahora tenemos un nuevo método en Rspec 3.3. Simplemente podemos ejecutar en rspec spec/unit/baseball_spec.rb[#context:#it]lugar de usar un número de línea. Tomado de aquí:

RSpec 3.3 presenta una nueva forma de identificar ejemplos [...]

Por ejemplo, este comando:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] ... ejecutaría el segundo y cuarto ejemplo o grupo definido bajo el primer grupo de nivel superior definido en spec / unit / baseball_spec.rb.

Entonces, en lugar de hacer rspec spec/unit/baseball_spec.rb:42donde está (prueba en la línea 42) es la primera prueba, simplemente podemos hacer rspec spec/unit/baseball_spec.rb[1:1]o rspec spec/unit/baseball_spec.rb[1:1:1]dependiendo de qué tan anidado esté el caso de prueba.

Ingo
fuente
5

En los carriles 5,

Utilicé esta manera para ejecutar un solo archivo de prueba (todas las pruebas en un archivo)

rails test -n /TopicsControllerTest/ -v

El nombre de la clase se puede usar para que coincida con el archivo deseado TopicsControllerTest

Mi clase class TopicsControllerTest < ActionDispatch::IntegrationTest

Salida:

ingrese la descripción de la imagen aquí

Si lo desea, puede ajustar la expresión regular para que coincida con el método de prueba único \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v
Alupotha
fuente
4

Para el modelo, solo se ejecutará el caso en la línea número 5

bundle exec rspec spec/models/user_spec.rb:5

Para el controlador: solo se ejecutará el caso en la línea número 5

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Para el modelo de señal o controlador, elimine el número de línea de arriba

Para ejecutar case en todos los modelos

bundle exec rspec spec/models

Para ejecutar case en todos los controladores

bundle exec rspec spec/controllers

Para ejecutar todos los casos

 bundle exec rspec 
Sandeep Kapil
fuente
3

Ejecute los comandos desde el directorio raíz de su proyecto:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45
Allison
fuente
1

comenzando con rspec 2 puede usar lo siguiente:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end
Rudi
fuente
0

Dado que está en un proyecto de rails 3 con rspec 2, desde el directorio raíz de rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

Definitivamente debería funcionar. me cansé de escribir eso, así que creé un alias para acortar 'bundle exec rspec' a 'bersp'

'bundle exec' es para cargar el entorno de gemas exacto especificado en su archivo de gemas: http://gembundler.com/

Rspec2 cambió del comando 'spec' al comando 'rspec'.

MissingHandle
fuente
0

Utilizo esta gema de guardia para ejecutar automáticamente mi prueba. Ejecuta la prueba después de crear o actualizar operaciones en el archivo de prueba.

https://github.com/guard/guard-test

o por lo general puedes ejecutar usando el siguiente comando

rspec spec / controllers / groups_controller_spec.rb

Rameshwar Vyevhare
fuente
0

Puedes hacer algo como esto:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller
Prabhakar Undurthi
fuente
0

Puedes usar

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

el número de línea debe ser el número de línea de las líneas 'describir' o 'it' para que ejecute las pruebas presentes en ese bloque en particular. en su lugar, ejecutará todas las líneas al lado de line_number.

También puede crear bloques con un nombre personalizado y luego puede ejecutar esos bloques solamente.

Akshay Dhobale
fuente
0

Otro error común es tener o haber actualizado una aplicación Rails anterior a Rails 5+ y colocarla require 'spec_helper'en la parte superior de cada archivo de prueba. Esto debería cambiar a require 'rails_helper'. Si observa un comportamiento diferente entre la tarea de rastrillo ( rake spec) y cuando ejecuta una sola especificación ( rspec path/to/spec.rb), esta es una razón común

la mejor solución es

1) asegúrese de estar usando require 'rails_helper'en la parte superior de cada uno de sus archivos de especificaciones, no el estilo anterior require 'spec_helper' 2) use la rake spec SPEC=path/to/spec.rbsintaxis

rspec path/to/spec.rbCreo que el estilo antiguo debería considerarse fuera de moda por la comunidad en este momento en 2020 (pero, por supuesto, lo hará funcionar, dejando de lado otras consideraciones)

Jason FB
fuente