Jak uruchomić tylko określone testy w Rspec?

159

Myślę, że jest sposób, aby uruchomić tylko testy z podaną etykietą. Czy ktoś wie?

Nathan Long
źródło

Odpowiedzi:

186

Nie jest łatwo znaleźć dokumentację, ale możesz oznaczać przykłady hashem. Na przykład.

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

Więcej informacji na GitHub . (każdy z lepszym linkiem, proszę o poradę)

(aktualizacja)

RSpec jest teraz doskonale udokumentowany tutaj . Zobacz sekcję opcji --tag, aby uzyskać szczegółowe informacje.

Od wersji 2.6 ten rodzaj tagu można wyrazić jeszcze prościej, dołączając opcję konfiguracji treat_symbols_as_metadata_keys_with_true_values, która umożliwia:

describe "Awesome feature", :awesome do

gdzie :awesomejest traktowany tak, jakby był :awesome => true.

Zobacz również tę odpowiedź, aby dowiedzieć się, jak skonfigurować RSpec do automatycznego uruchamiania „ukierunkowanych” testów. Działa to szczególnie dobrze z Guard .

zetetic
źródło
Więc nie musisz szukać, bezpośredni link do sugestii zetetic jest tutaj (dla Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/ ...
tir38
Dodaliśmy specyfikację do naszego zestawu, aby zapewnić, że kod nigdy nie zostanie scalony z fokusem: prawda nadal w kontroli źródła. gist.github.com/jwg2s/7361603
jwg2s
@ jwg2s Używam haka git do blokowania zatwierdzeń :focus, co również zapobiega przedostawaniu się niepożądanych elementów, takich jak „binding.pry , console.log”, itp. do bazy kodu.
zetetic
1
@Otheus nie, jestem tylko fanem :) Bardzo podoba mi się to, co zrobili w Relish, ale SO właśnie uruchomił własną funkcję dokumentacji, więc możemy zobaczyć konkurencję.
zetetic
1
Może wskażesz mi drogę do dokumentacji, która faktycznie opisuje użycie i rzeczywiste zachowanie rspecprogramu :) Ponieważ dokument Relish tego nie robi.
Otheus
111

Możesz uruchomić wszystkie testy, które zawierają określony ciąg z opcją --example (lub -e) :

rspec spec/models/user_spec.rb -e "User is admin"

Używam tego najczęściej.

Jan Minárik
źródło
90

W twoim spec_helper.rb:

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

a następnie w specyfikacjach:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

Możesz także skupić się na testach za pomocą „fit” lub wykluczyć za pomocą „xit”, na przykład:

fit 'can do so and so' do
    # This is the only test that will run
end
Tom Chapin
źródło
1
W rspec 3.5 jest config.filter_run_when_matchingi może działać, dodając :focusdo przykładu
Ali Ghanavatian
4
Jeśli „focus: true” zostanie przypadkowo zatwierdzony, twój CI przejdzie, mimo że większość testów nie została uruchomiona.
zach
67

alternatywnie możesz podać numer linii: rspec spec/my_spec.rb:75- numer linii może wskazywać na pojedynczą specyfikację lub blok kontekstu / opisu (uruchamianie wszystkich specyfikacji w tym bloku)

Alex Lang
źródło
50

Możesz również wpisać wiele numerów linii razem z dwukropkiem:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

Wynik:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
Jonathon Batson
źródło
To jest takie złoto! 🙇🏾‍♂️
iGbanam
28

Jak z RSpec 2.4 (chyba) można poprzedają flub xdo it, specify, describei context:

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#fit-class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#xit-class_method

Upewnij się, że masz config.filter_run focus: truei config.run_all_when_everything_filtered = truew swoim spec_helper.rb.

Joshua Muheim
źródło
3

Możesz także uruchomić specyfikacje, które mają focus: truedomyślnie

spec / spec_helper.rb

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

Następnie po prostu biegnij

$ rspec

i zostanie uruchomiony tylko test skoncentrowany

następnie po usunięciu focus: truewszystkich testów uruchom je ponownie

Więcej informacji: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters

itsnikolay
źródło
Czy jest spec/spec_helper.rbzawsze uwzględniony? Czy tylko wtedy, gdy nie podano opcji? Dlaczego moduły testowe mają require 'spec_helber', a nie posiadają powyższego kodu, eliminują możliwość wykonania pojedynczego testu poprzez określenie pliku? Nie mogę znaleźć żadnej dokumentacji na ten temat.
Otheus
1
spec_helper.rbjest zawsze uwzględniany, jeśli masz --require spec_helperw .rspeckatalogu głównym projektu.
Kris
0

Możesz biegać jako rspec spec/models/user_spec.rb -e "SomeContext won't run this".

Avijit Majhi
źródło