Eine Gruppe von Tests in rspec deaktivieren?

102

Ich habe eine Testspezifikation, die describeseine Klasse und innerhalb dieser verschiedene contextsmit verschiedenen itBlöcken hat.

Gibt es eine Möglichkeit, eine contextvorübergehend zu deaktivieren ?

Ich habe versucht, einen pending "temporarily disabled"Anruf ganz oben innerhalb eines contextzu deaktivierenden Anrufs hinzuzufügen , und ich habe beim Ausführen der Spezifikation etwas über anstehend gesehen, aber dann wurden die restlichen Tests einfach fortgesetzt.

Das hatte ich irgendwie:

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

Aber wie gesagt, es wurden nur die Tests unter dem anstehenden Anruf ausgeführt.

Die Suche führte mich zu diesem Mailinglisten-Thread, in dem der Ersteller (?) Von rspec sagt, dass dies in rspec 2 möglich ist, das ich ausführe. Ich denke, es hat funktioniert, aber es hatte nicht den gewünschten Effekt, alle folgenden Tests zu deaktivieren. Daran denke ich, wenn ich einen pendingAnruf sehe .

Gibt es eine Alternative oder mache ich es falsch?

Jorge Israel Peña
quelle

Antworten:

164

So deaktivieren Sie einen Strukturbaum mit RSpec 3 :

before { skip }
# or 
xdescribe
# or 
xcontext

Sie können eine Nachricht mit Überspringen hinzufügen , die in der Ausgabe angezeigt wird:

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

mit RSpec 2 :

before { pending }
Pyro
quelle
1
Wie macht man das genau auf einem Block, der hat:describe 'XXXXX' do .... end
p.matsinopoulos
2
@ p.matsinopoulos Fügen Sie es einfach der folgenden Zeile hinzu describe 'XXXXX' do. Hat wie ein Zauber funktioniert, danke @Pyro!
Chesterbr
Einfachere Lösung als Filter, +1
Dolzenko
Ich liebe dich. Ich schulde dir ein Bier!
Aldo 'xoen' Giambelluca
2
Das ist nett. Sie können auch eine Nachricht nach 'Überspringen' einfügen, die in der Ausgabe angezeigt wird.
Jan Hettich
44

Verwenden Sie Ausschlussfilter . Von dieser Seite: In Ihremspec_helper.rb (oder rails_helper.rb)

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

In Ihrem 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

Wenn ich "rspec ./spec/sample_spec.rb --format doc" ausführe

Dann sollte die Ausgabe "Gruppe 2 Beispiel 1" enthalten.

Und die Ausgabe sollte nicht "Gruppe 1 Beispiel 1" enthalten.

Und die Ausgabe sollte nicht "Gruppe 1 Beispiel 2" enthalten.

Robert Speicher
quelle
19

Sehen Sie, was Sie davon halten:

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

Ich möchte Gründe für meine ausstehenden Elemente sehen, wenn ich etwas für "eine Weile" deaktiviere. Sie dienen als kleine Kommentare / TODOs, die regelmäßig präsentiert werden, anstatt in einem Kommentar oder einem ausgeschlossenen Beispiel / einer ausgeschlossenen Datei vergraben zu sein.

Das Wechseln itzu pendingoder xitist schnell und einfach, aber ich bevorzuge die Hash-Konstruktion. Es bietet Ihnen eine Dokumentation für jeden Lauf, ist ein Drop-In (ändert keine Beschreibung / Kontext / es, sodass ich später entscheiden muss, was ich erneut verwenden möchte) und kann genauso einfach entfernt werden, wenn die Entscheidung getroffen oder der Blocker entfernt wird .

Dies funktioniert genauso für Gruppen und einzelne Beispiele.

Botimer
quelle
Ich bin mir auch nicht sicher, ob es für die Beschreibung genauso funktioniert, aber in den anstehenden Fällen wird der Test tatsächlich ausgeführt und schlägt fehl, wenn der Test zu bestehen beginnt. Das xdescribe (ich denke genau wie xit) - führt es einfach nicht aus.
PL J
1
bestätigte, dass dies mit beiden pending:und skip:in rspec 3.6.0 funktioniert. Scheint mir die beste Lösung zu sein. In rspec3 werden ausstehende Tests weiterhin ausgeführt, dies jedoch skipnicht (wie auch immer Sie das anwenden skip).
Jrochkind
9

noch einer. https://gist.github.com/1300152

Verwenden Sie xdescribe, xcontext, xit, um es zu deaktivieren.

Aktualisieren:

Seit rspec 2.11 enthält es standardmäßig xit. so wird der neue Code sein

# 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

Verwendung

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

Verwenden Sie ausstehend statt beschreiben. Wenn Ihr Block ist:

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

Sie können den gesamten Block überspringen, indem Sie:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end
Amir Samakar
quelle
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
Matt
quelle
0

Nur um zu erklären, was mit Ihrem Code passiert. Wenn Sie es dort einfügen, wo es vorhanden ist, wird es nur ausgewertet (und daher ausgeführt), wenn die Datei beim Start geladen wird. Sie müssen es jedoch ausführen, wenn die Tests ausgeführt werden. Aus diesem Grund haben die Antworten vorgeschlagen, pending(RSpec 2) oder skip(RSpec 3) in einen beforeBlock zu setzen.

PhilT
quelle