Wyłączyć grupę testów w rspec?

104

Mam specyfikację testową, która describesma klasę i ma różne, contextskażda z różnymi itblokami.

Czy jest sposób, aby contexttymczasowo wyłączyć ?

Próbowałem dodać pending "temporarily disabled"wywołanie na samej górze w polu, contextktóre chcę wyłączyć, i zobaczyłem coś o toczeniu, kiedy uruchomiłem specyfikację, ale potem po prostu kontynuował wykonywanie pozostałych testów.

Oto, co miałem:

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

ale tak jak powiedziałem, po prostu uruchomiono testy w ramach oczekującego połączenia.

Wyszukiwanie doprowadziło mnie do wątku na liście dyskusyjnej, w którym twórca (?) Rspec mówi, że jest to możliwe w rspec 2, który uruchamiam. Myślę, że zadziałało, ale nie przyniosło oczekiwanego efektu wyłączenia wszystkich poniższych testów, o czym myślę, gdy widzę pendingpołączenie.

Czy jest alternatywa, czy też robię to źle?

Jorge Israel Peña
źródło

Odpowiedzi:

167

Aby wyłączyć drzewo specyfikacji za pomocą RSpec 3 , możesz:

before { skip }
# or 
xdescribe
# or 
xcontext

Możesz dodać wiadomość z pominięciem, która pojawi się na wyjściu:

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

z RSpec 2 :

before { pending }
Pyro
źródło
1
Jak dokładnie to zrobisz na bloku, który ma:describe 'XXXXX' do .... end
p.matsinopoulos
2
@ p.matsinopoulos Po prostu dodaj go do następującego wiersza describe 'XXXXX' do. Działa jak urok, dzięki @Pyro!
chesterbr
Prostsze rozwiązanie niż filtry, +1
dolzenko
Kocham Cię. Jestem ci winien piwo!
Aldo 'xoen' Giambelluca
2
To jest miłe. Możesz także dołączyć wiadomość po „pomiń”, która pojawi się na wyjściu.
Jan Hettich
44

Użyj filtrów wykluczeń . Z tej strony: w Twoim spec_helper.rb(lub rails_helper.rb)

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

W twoim teście:

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

Kiedy uruchamiam „rspec ./spec/sample_spec.rb --format doc”

Następnie wynik powinien zawierać „grupa 2 przykład 1”

Wynik nie powinien zawierać „grupy 1, przykład 1”

Wynik nie powinien zawierać „grupy 1, przykład 2”

Robert Speicher
źródło
19

Zobacz, co o tym myślisz:

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

Lubię widzieć przyczyny moich oczekujących pozycji, kiedy wyłączam coś na „jakiś czas”. Służą jako małe komentarze / zadania do wykonania, które są prezentowane regularnie, a nie grzebane w komentarzach lub wykluczonych przykładach / plikach.

Zmiana itna pendinglub xitjest szybka i łatwa, ale wolę konstrukcję hash. Daje ci dokumentację każdego uruchomienia, jest drop-in (nie zmienia opisu / kontekstu / tego, więc muszę zdecydować, czego użyć ponownie później) i jest równie łatwo usuwany, jeśli decyzja zostanie podjęta lub bloker zostanie usunięty .

Działa to tak samo w przypadku grup i pojedynczych przykładów.

botimer
źródło
Nie jestem również pewien, czy działa to tak samo w przypadku opisu, ale w toku faktycznie uruchamia test i kończy się niepowodzeniem, jeśli zaczyna się on zdawać. Xdescribe (chyba tak jak xit) - po prostu go nie uruchamia.
PL J
1
potwierdził, że to działa, zarówno z, jak pending:iw skip:rspec 3.6.0. Wydaje mi się, że to najlepsze rozwiązanie. w rspec3 w toku nadal uruchamia testy, ale skipnie (jakkolwiek zastosujesz skip).
jrochkind
9

inny. https://gist.github.com/1300152

użyj xdescribe, xcontext, xit, aby go wyłączyć.

Aktualizacja:

Od rspec 2.11 domyślnie zawiera xit. więc nowy kod będzie

# 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

Stosowanie

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 
GutenYe
źródło
3

Użyj oczekujących zamiast opisywać. Jeśli Twój blok to:

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

Możesz pominąć cały blok poprzez:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end
Amir Samakar
źródło
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
źródło
0

Tylko po to, żeby wyjaśnić, co się dzieje z twoim kodem. Włączając go tam, gdzie masz, jest on po prostu oceniany (i dlatego jest uruchamiany), gdy plik jest ładowany podczas uruchamiania. Jednak trzeba go uruchomić podczas wykonywania testów. Dlatego odpowiedzi sugerują umieszczenie pending(RSpec 2) lub skip(RSpec 3) w beforebloku.

PhilT
źródło