Disabilitare un gruppo di test in rspec?


103

Ho una specifica di prova che describesuna classe e al suo interno ha vari contextsciascuno con vari itblocchi.

C'è un modo per disabilitare contexttemporaneamente un ?

Ho provato ad aggiungere una pending "temporarily disabled"chiamata all'inizio di un messaggio contextche desidero disabilitare e ho visto qualcosa in sospeso quando ho eseguito la specifica, ma poi ha continuato a eseguire il resto dei test.

Questo è quello che ho avuto:

describe Something
  context "some tests" do
    it "should blah" do
      true
    end
  end

  context "some other tests" do
    pending "temporarily disabled"

    it "should do something destructive" do
      blah
    end
  end
end

ma come ho detto, è andato avanti con i test sotto la chiamata in sospeso.

La ricerca mi ha portato a questo thread della mailing list in cui il creatore (?) Di rspec dice che è possibile in rspec 2, che sto eseguendo. Immagino che abbia funzionato ma non ha avuto l'effetto desiderato di disabilitare tutti i seguenti test, che è ciò a cui penso quando vedo una pendingchiamata.

C'è un'alternativa o sto sbagliando?

Risposte:


166

Per disabilitare un albero di specifiche utilizzando RSpec 3 puoi:

before { skip }
# or 
xdescribe
# or 
xcontext

Puoi aggiungere un messaggio con skip che verrà visualizzato nell'output:

before { skip("Awaiting a fix in the gem") }

con RSpec 2 :

before { pending }

1
Come lo fai esattamente su un blocco che ha:describe 'XXXXX' do .... end
p.matsinopoulos

2
@ p.matsinopoulos Aggiungilo alla riga seguente describe 'XXXXX' do. Ha funzionato a meraviglia, grazie @Pyro!
chesterbr

Soluzione più semplice dei filtri, +1
dolzenko

Ti amo. Ti devo una birra!
Aldo 'xoen' Giambelluca

2
Questo è carino. Puoi anche includere un messaggio dopo "salta" che verrà visualizzato nell'output.
Jan Hettich

44

Utilizza filtri di esclusione . Da quella pagina: nel tuo spec_helper.rb(o rails_helper.rb)

RSpec.configure do |c|
  c.filter_run_excluding :broken => true
end

Nel tuo test:

describe "group 1", :broken => true do
  it "group 1 example 1" do
  end

  it "group 1 example 2" do
  end
end

describe "group 2" do
  it "group 2 example 1" do
  end
end

Quando eseguo "rspec ./spec/sample_spec.rb --format doc"

Quindi l'output dovrebbe contenere "gruppo 2 esempio 1"

E l'output non deve contenere "gruppo 1 esempio 1"

E l'output non deve contenere "gruppo 1 esempio 2"


19

Guarda cosa ne pensi di questo:

describe "something sweet", pending: "Refactor the wazjub for easier frobbing" do
  it "does something well"
  it "rejects invalid input"
end

Mi piace vedere i motivi dei miei elementi in sospeso quando disabilito qualcosa per "un po '". Servono come piccoli commenti / TODO che vengono presentati regolarmente piuttosto che sepolti in un commento o in un esempio / file escluso.

Il passaggio ita pendingo xitè semplice e veloce, ma preferisco la costruzione hash. Ti fornisce la documentazione di ogni esecuzione, è un drop-in (non cambia descrizione / contesto / esso quindi devo decidere cosa usare di nuovo in seguito), ed è altrettanto facilmente rimosso se la decisione viene presa o il blocco viene rimosso .

Funziona allo stesso modo per gruppi e singoli esempi.


Inoltre, non sono sicuro che funzioni allo stesso modo per la descrizione, ma nella versione in sospeso esegue effettivamente il test e fallisce se il test inizia a passare. Xdescribe (immagino proprio come xit) - semplicemente non lo esegue.
PL J

1
confermato che questo funziona, sia con pending:e skip:, in rspec 3.6.0. Mi sembra la soluzione migliore. in rspec3 pending esegue ancora i test, ma skipnon (comunque si applica il skip).
jrochkind

9

un altro. https://gist.github.com/1300152

usa xdescribe, xcontext, xit per disabilitarlo.

Aggiornare:

A partire da rspec 2.11, include xit per impostazione predefinita. quindi il nuovo codice sarà

# put into spec_helper.rb
module RSpec
  module Core
    module DSL
      def xdescribe(*args, &blk)
        describe *args do
          pending 
        end
      end

      alias xcontext xdescribe
    end
  end
end

uso

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 

3

Usa in sospeso invece di descrivere. Se il tuo blocco è:

context "some other tests" do
  it "should do something destructive" do
    blah
  end
end

Puoi saltare l'intero blocco:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end

1
describe "GET /blah" do

  before(:each) { pending "Feature to be implemented..." }

  it { expect(page).to have_button("Submit") }
  it { expect(page).to have_content("Blah") }
end

0

Solo per spiegare cosa sta succedendo con il tuo codice. Includendolo dove hai, viene valutato (e quindi eseguito) quando il file viene caricato durante l'avvio. Tuttavia è necessario che venga eseguito quando vengono eseguiti i test. Ecco perché le risposte hanno suggerito di inserire pending(RSpec 2) o skip(RSpec 3) in un beforeblocco.

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.