Come si esegue un singolo file test / specifica in RSpec?


282

Voglio essere in grado di eseguire i test di un singolo file di specifiche, ad esempio per il file che sto modificando. rake specesegue tutte le specifiche. Il mio progetto non è un progetto Rails, quindi rake spec:docnon funziona.

Non so se questo è importante, ma ecco la mia struttura di directory.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb

Risposte:


392

Oppure puoi saltare il rake e usare il comando 'rspec':

rspec path/to/spec/file.rb

Nel tuo caso, penso che fintanto che il tuo file ./spec/db_spec.rb include gli helper appropriati, dovrebbe funzionare bene.

Se stai usando una versione precedente di rspec è:

spec path/to/spec/file.rb

31
con il nuovo rspec devi usare "rspec path / to / file.rb"
djburdick

3
Forse sto sbagliando, ma devo fare "bundle exec rspec path / to / spec / file.rb"
andrhamm

2
Se stai usando Rails probabilmente vorrai eseguire le tue specifiche usando Rake per assicurarti di iniziare da un database vuoto.
superluminario

@andrhamm, stai solo eseguendo le tue specifiche nel contesto del tuo pacchetto. Questo è necessario se non stai usando gemset (che vengono di default con rvm e sono un'estensione separata di rbenv)
Caleb

6
Se si desidera eseguire solo un test, aggiungere il numero di riga dell'inizio del test al file. Esempio: percorso rspec / to / spec / file.rb: 455
runamok

201

L'invocazione grezza:

rake spec SPEC = spec / controllers / sessioni_controller_spec.rb \
          SPEC_OPTS = "- e \" dovrebbe accedere con il cookie \ ""

Ora scopri come incorporarlo nel tuo editor.


1
Come ho detto, non sono su binari quindi non ci sono controller. Ma sì, "rake spec SPEC = file.rb" funziona. Grazie! Sto lavorando all'integrazione di Emacs ora.
Jonathan Tran,

5
Non avviare il rakefile se puoi evitarlo. Ci vogliono secoli di frickin
Orion Edwards,

2
Ho modificato la risposta accettata, ma il parametro SPEC_OPTS è stato utile anche per me.
Jonathan Tran,

2
Questo è quello che chiamo una buona risposta. Perché non è contrassegnato come "Risposta"?
gmile,

1
L'esecuzione diretta delle specifiche è spesso la scelta migliore, ma ci sono molte volte in cui devi eseguire il rake per vari bit magici in un Rakefile personalizzato
Nerdmaster

124

Questa domanda è vecchia, ma viene visualizzata nella parte superiore di Google quando si cerca come eseguire un singolo test. Non so se si tratta di un'aggiunta recente, ma per eseguire un singolo test con una specifica è possibile effettuare le seguenti operazioni:

rspec path/to/spec:<line number>

dove -line number- è un numero di riga che contiene parte del test. Ad esempio, se hai avuto una specifica come:

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

Diciamo che è stato salvato in spec / models / foo_spec.rb. Quindi eseguiresti:

rspec spec/models/foo_spec.rb:2

e avrebbe semplicemente eseguito quella specifica. In realtà, quel numero potrebbe essere compreso tra 2 e 5.

Spero che questo ti aiuti!


Questo è interessante, anche se sembra che non funzioni una volta che hai trasformato la tua specifica in più file (cioè puoi usarla solo con il file principale _spec.rb, ma se nessuno dei tuoi esempi è dentro, non funzionerà nulla Inoltre, se provi a usarlo per un file che non è un file di specifiche di livello superiore, anche quello non funzionerà.)
Trejkaz,

Non lo seguo del tutto. Cosa intendi con "file di specifiche di livello superiore?" La mia suite di test è praticamente sempre divisa in più file e posso sempre invocare i test in un singolo file usando questo metodo. Intendi avere un file che è requirei tuoi altri file di specifiche?
juanpaco,

Posso usarlo su qualsiasi file a qualsiasi livello nella directory spec /. Credo che Trejkaz sia errato.
Michael Durrant,

7
questo è fantastico e dovrebbe essere al top!
Tommaso Barbugli,

4
Lo uso sempre, ma a volte vuoi eseguire diversi test da un unico file. Quindi puoi digitare tutti gli esempi in questo modo:rspec spec/models/foo_spec.rb:2:12:49
swilgosz,

61

Puoi anche usare il testo effettivo del test case * e * xample con -e!

Così per:

it "shows the plane arrival time"

Puoi usare

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'

non c'è bisogno di rastrellare qui.


Questo è tutto ciò di cui hai bisogno, tranne che "spec" dovrebbe essere sostituito da "rspec" come dichiarato @bandhunt
Nicolas Wormser il

19

da help (spec -h):

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

Esempio: spec spec / runner_spec.rb -l 162


3
Nelle versioni Rspec più recenti si aggiunge il numero di riga dopo i due punti :per la documentazione e una risposta popolare.
dragon788,

13

Se hai installato rspec come plugin anziché come gemma, non avrai l' speceseguibile.

Ad ogni modo, tutto ciò che devi fare è eseguire il file usando ruby. Il codice rspec è abbastanza intelligente da eseguire i test per te.

per esempio:

ruby myclass_spec.rb

2
È possibile eseguire un test all'interno del file in questo modo?
Ian Vaughan,

12

http://github.com/grosser/single_test ti consente di fare cose come ..

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

Sembra che la gemma non sia stata mantenuta, l'ultimo commit è stato 5 anni fa!
thegreendroid

10

Ruby 1.9.2 e Rails 3 hanno un modo semplice per eseguire un file di specifica:

  ruby -I specifiche spec / modelli / user_spec.rb

Spiegazione:

  • rubyil comando tende ad essere più veloce del rakecomando
  • -I spec significa "includere la directory 'spec' quando si cercano file"
  • spec/models/user_spec.rb è il file che vogliamo eseguire.

Puoi eseguire un test all'interno di quel file con alcune opzioni extra?
Ian Vaughan,

10

Per eseguire tutti i tuoi file rspec:rspec

nota: devi essere alla radice del tuo progetto

Per eseguire un file rspec:rspec 'path_to/spec.rb'

nota: sostituisci 'path_to / spec.rb' con il tuo percorso. Virgolette facoltative.

Per eseguire un test rspec da un file:rspec 'path_to/spec.rb:7'

nota:: 7 è il numero di riga da cui inizia il test


5

Ho avuto problemi a far funzionare uno di questi esempi, forse perché il post è vecchio e i comandi sono cambiati?

Dopo aver frugato in giro ho scoperto che funziona:

rspec spec / models / user_spec.rb

Ciò eseguirà solo il singolo file e fornirà un utile output nel terminale.


Questo è stato menzionato in un commento nella risposta accettata. Sì, penso che questo post sia così vecchio che il nome del comando è cambiato.
Jonathan Tran

4

specky.vim


3

In alternativa, dai un'occhiata all'autotest.

L'esecuzione dell'autotest in una finestra di comando significa che il file delle specifiche verrà eseguito ogni volta che lo salvi. Inoltre, verrà eseguito ogni volta che viene eseguito il file che stai ipotizzando.

Ad esempio, se si dispone di un file di specifiche del modello chiamato person_spec.rb e di un file di modello che sta speculando chiamato person.rb, ogni volta che si salva uno di questi file dall'editor, verrà eseguito il file di specifiche.


3

Sebbene siano state scritte molte grandi risposte a questa domanda, nessuna di esse utilizza l' approccio Rspectags .

Uso i tag per eseguire una o più specifiche in file diversi, solo quelli relativi alla mia attuale attività di sviluppo.

Ad esempio, aggiungo il tag "dev" con il valore "corrente":

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

poi corro

bundle exec rspec . --tag dev:current

Tag / valori diversi possono essere impostati in singole specifiche o gruppi.


2

Diciamo che stai eseguendo un test per creare todo. Puoi sempre eseguire quel codice specifico todo specifico usando il file crete_spec.rb come di seguito.

      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

Se si desidera eseguire tutte le specifiche in un singolo corto.

   rspec 

Se si desidera eseguire tutte le specifiche in un utente controller specifico questo.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

Spero ti dia più comprensione!

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.