Come eseguire un singolo test RSpec?


306

Ho il seguente file:

/spec/controllers/groups_controller_spec.rb

Quale comando nel terminale uso per eseguire solo quella specifica e in quale directory devo eseguire il comando?

Il mio file gemma:

# 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

File delle specifiche:

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

Puoi eseguire i tuoi test come bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, esegue solo questo test specifico. Maggiori informazioni qui: kolosek.com/rails-rspec-setup
Nesha Zoric

bundle exec rspec spec --helpti darò la risposta:
Thomas Decaux,

Risposte:


15

Non sono sicuro di quanto tempo questa ape sia disponibile, ma esiste una configurazione Rspec per eseguire il filtro - quindi ora puoi aggiungere questo al tuo spec_helper.rb:

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

E quindi aggiungi un tag focus al it, contexto describeper eseguire solo quel blocco:

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

Documentazione RSpec:

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


1
Ciò richiede una modifica dell'infrastruttura. E ricordando di cambiarlo di nuovo. Consiglierei di non farlo e di usare solo i rspeccomandi per eseguire le specifiche con il parametro appropriato per indicare quale
Michael Durrant,

482

Di solito lo faccio:

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

Dove 42rappresenta la linea del test che voglio eseguire.

Edit1:

Puoi anche usare i tag. Vedi qui .

MODIFICA 2:

Provare:

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

Grazie provato che non funziona quando eseguo il rake spec /spec/path...:XX Ottengo l'errore /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

Se provo ad usare solo RSPEC, ottengo questo errore: "$ rspec spec / controllerers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : in `setup ': Hai già attivato rspec-core 2.6.2, ma il tuo Gemfile richiede rspec-core 2.6.0. Considera l'utilizzo del bundle exec. (Gem :: LoadError)"
AnApprentice

Puoi provare "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19" in quel caso
muffinista

bundle exec ha funzionato, ma perché? È un hack un modo per evitarlo?
AnApprentice

11
non è un hack, ma ti assicura di utilizzare la stessa versione che hai dichiarato nel tuo file gem. Nel tuo caso, il semplice rspecnon è riuscito perché la versione sul tuo sistema è più recente di quella nel tuo file di gemme.
ricordo del

67

Con rastrello:

rake spec SPEC=path/to/spec.rb

(Il merito va a questa risposta . Vai a votarlo.)

EDIT (grazie a @cirosantilli): per eseguire uno scenario specifico all'interno della specifica, è necessario fornire una corrispondenza del modello regex che corrisponda alla descrizione.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
Questa è la risposta migliore perché usa il comando 'rake spec' non il comando 'rspec'. Ciò significa che il database di test viene reinizializzato correttamente ogni volta (cosa che non accade se si utilizza 'rspec ...')
jpw,

È possibile utilizzare SPEC=path/to/spec.rb:42per eseguire il test sul numero di riga specificato, anche se sembra che anche tutti i it_behaves_liketest vengano eseguiti (bug?).
mgold

61

È possibile passare una regex al comando spec che eseguirà solo i itblocchi corrispondenti al nome fornito.

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

Aggiornamento 2019: Rspec2 è passato dal comando 'spec' al comando 'rspec'.


Grazie, ma ci sono errori con: $ rake spec spec / controllers / incoming_mails_controller_spec.rb -e "dovrebbe avere successo e restituire 3 elementi" rake interrotto! (eval): 1: in `standard_rake_options ': errore di compilazione (eval): 1: errore di sintassi, tIDENTIFIER imprevisto, in attesa di $ end dovrebbe avere successo e restituire 3 elementi
AnApprentice

Aggiornato con le idee del file delle specifiche effettive?
AnApprentice

Se si verifica un errore di compilazione, la specifica non è ruby ​​valida. Assicurarsi che non manca un dodopo it, contexto di describedichiarazione.
Douglas F Shearer,

1
È "spec", non "rake spec".
muffinista,

questa dovrebbe essere la risposta corretta, in relazione a un numero di riga è gravemente sbagliato - in ogni caso
Eugen Mayer,

27

Ci sono molte opzioni:

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

23

Il mio metodo preferito per eseguire test specifici è leggermente diverso: ho aggiunto le righe

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

Nel mio file spec_helper.

Ora, ogni volta che voglio eseguire un test specifico (o contesto o specifica), posso semplicemente aggiungere il tag "focus" ad esso ed eseguire il mio test normalmente - solo i test focalizzati verranno eseguiti. Se rimuovo tutti i tag di messa a fuoco, si run_all_when_everything_filteredavvia ed esegue tutti i test normalmente.

Non è così semplice e veloce come le opzioni della riga di comando: richiede di modificare il file per il test che si desidera eseguire. Ma ti dà molto più controllo, credo.


Preferisco decisamente questo stile, perché eseguo comunemente test tramite Rubymine / intelliJ. Mi piace questo metodo anche perché è simile all'utilizzo di fit / xit in jasmine / with gulp
wired00

9

La risposta di @apneadiving è un modo pulito per risolvere questo problema. Tuttavia, ora abbiamo un nuovo metodo in Rspec 3.3. Possiamo semplicemente eseguire rspec spec/unit/baseball_spec.rb[#context:#it]invece di utilizzare un numero di riga. Tratto da qui:

RSpec 3.3 introduce un nuovo modo per identificare esempi [...]

Ad esempio, questo comando:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] ... eseguirà il secondo e il quarto esempio o gruppo definito nel primo gruppo di primo livello definito in spec / unit / baseball_spec.rb.

Quindi invece di fare rspec spec/unit/baseball_spec.rb:42dove (test nella riga 42) è il primo test, possiamo semplicemente fare rspec spec/unit/baseball_spec.rb[1:1]o in rspec spec/unit/baseball_spec.rb[1:1:1]base a quanto è annidato il caso di test.


5

Nelle rotaie 5,

Ho usato questo modo per eseguire un singolo file di test (tutti i test in un file)

rails test -n /TopicsControllerTest/ -v

Il nome della classe può essere utilizzato per abbinare il file desiderato TopicsControllerTest

La mia classe class TopicsControllerTest < ActionDispatch::IntegrationTest

Produzione :

inserisci qui la descrizione dell'immagine

Se lo desideri, puoi modificare regex in modo che corrisponda al metodo di test singolo \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

Per il modello, verrà eseguito il caso solo sulla riga numero 5

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

Per controller: verrà eseguito solo sulla riga numero 5

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

Per il modello di segnale o il controller rimuovere il numero di riga dall'alto

Per eseguire il caso su tutti i modelli

bundle exec rspec spec/models

Per eseguire case su tutti i controller

bundle exec rspec spec/controllers

Per eseguire tutti i casi

 bundle exec rspec 

3

Esegui i comandi dalla directory principale del tuo progetto:

# 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

1

a partire da rspec 2 è possibile utilizzare quanto segue:

# 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

0

Dato che sei su un progetto rails 3 con rspec 2, dalla directory root di rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

dovrebbe assolutamente funzionare. mi sono stancato di digitarlo così ho creato un alias per abbreviare 'bundle exec rspec' in 'bersp'

'bundle exec' è tale da caricare esattamente l'ambiente gem specificato nel file gem: http://gembundler.com/

Rspec2 è passato dal comando 'spec' al comando 'rspec'.


0

Uso questa gemma di guardia per eseguire automaticamente il mio test. Esegue il test dopo aver creato o aggiornato le operazioni sul file di test.

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

o di solito è possibile eseguire utilizzando il seguente comando

rspec spec / controllerers / groups_controller_spec.rb


0

Puoi fare qualcosa del genere:

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

0

Puoi usare

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

il numero di riga deve essere il numero di riga delle righe "descrivi" o "it" in modo che esegua i test presenti in quel particolare blocco. invece eseguirà tutte le righe accanto a line_number.

inoltre è possibile creare blocchi con nome personalizzato e quindi eseguire solo quei blocchi.


0

Un altro errore comune è avere ancora o aver aggiornato un'app Rails precedente a Rails 5+ e inserirla require 'spec_helper'nella parte superiore di ogni file di test. Questo dovrebbe essere cambiato in require 'rails_helper'. Se si riscontra un comportamento diverso tra l'attività rake ( rake spec) e quando si esegue una singola specifica ( rspec path/to/spec.rb), questo è un motivo comune

la soluzione migliore è

1) assicurati di utilizzare require 'rails_helper'nella parte superiore di ciascuno dei tuoi file di specifiche - non il vecchio stile require 'spec_helper' 2) utilizzare ilrake spec SPEC=path/to/spec.rb sintassi

lo stile più vecchio secondo rspec path/to/spec.rbme dovrebbe essere considerato fuori moda dalla comunità in questo momento nel 2020 (ma ovviamente lo farai funzionare, altre considerazioni a parte)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.