Jak uruchomić pojedynczy test RSpec?


306

Mam następujący plik:

/spec/controllers/groups_controller_spec.rb

Jakiego polecenia w terminalu używam do uruchomienia właśnie tej specyfikacji iw jakim katalogu mam wykonać polecenie?

Mój plik klejnotów:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Plik specyfikacji:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end

Możesz uruchomić swoje testy, takie jak bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, uruchamia tylko ten konkretny test. Więcej informacji tutaj: kolosek.com/rails-rspec-setup
Zoric

bundle exec rspec spec --helpdam ci odpowiedź:
Thomas Decaux,

Odpowiedzi:


15

Nie jestem pewien, jak długo ma to dostępne, ale istnieje konfiguracja Rspec do filtrowania uruchomień - teraz możesz dodać to do spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

A następnie dodać tag ostrości do it, contextlub describeuruchomić tylko ten blok:

it 'runs a test', :focus do
  ...test code
end

Dokumentacja RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method


1
Wymaga to zmiany infrastruktury. I pamiętam, aby to zmienić z powrotem. Nie polecam tego robić i używać tylko rspecpoleceń do uruchomienia specyfikacji z odpowiednim parametrem, aby wskazać, który
Michael Durrant,

482

Zazwyczaj robię:

rspec ./spec/controllers/groups_controller_spec.rb:42

Gdzie 42reprezentuje linię testu, który chcę uruchomić.

EDYCJA 1:

Możesz także użyć tagów. Zobacz tutaj .

EDYCJA 2:

Próbować:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42

Dzięki próbowałem, że to nie działa, gdy robię rake spec /spec/path...:XX Otrzymuję błąd /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice

Jeśli spróbuję użyć tylko RSPEC, pojawia się błąd: „$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : w `setup ': Aktywowałeś już rspec-core 2.6.2, ale twój Gemfile wymaga rspec-core 2.6.0. Zastanów się nad użyciem pakietu exec. (Gem :: LoadError)"
AnApprentice

Możesz wypróbować „bundle exec rspec spec / controllers / groups_controller_spec.rb: 19” w takim przypadku
muffinista

pakiet exec działał, ale dlaczego? Czy to jakiś hack, aby tego uniknąć?
AnApprentice

11
to nie hack, upewnia się, że używasz tej samej wersji, którą zadeklarowałeś w swoim pliku gem. W twoim przypadku zwykłe rspeczawiodło, ponieważ wersja w twoim systemie jest nowsza niż ta w twoim pliku gem.
apneadiving

67

Z prowizją:

rake spec SPEC=path/to/spec.rb

(Kredyt idzie do tej odpowiedzi . Idź głosuj na niego.)

EDYCJA (dzięki @cirosantilli): Aby uruchomić jeden konkretny scenariusz w ramach specyfikacji, musisz podać dopasowanie wzorca wyrażenia regularnego pasujące do opisu.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
Jest to najlepsza odpowiedź, ponieważ używa polecenia „rake spec”, a nie „rspec”. Oznacza to, że testowa baza danych jest poprawnie inicjowana za każdym razem (co nie dzieje się, jeśli użyjesz „rspec ...”)
jpw

Możesz użyć SPEC=path/to/spec.rb:42do uruchomienia testu dla podanego numeru linii, chociaż wydaje się, że wszystkie it_behaves_liketesty również zostaną uruchomione (błąd?).
mgold

61

Możesz przekazać wyrażenie regularne do polecenia spec, które uruchomi tylko itbloki pasujące do podanej nazwy.

spec path/to/my_spec.rb -e "should be the correct answer"

Aktualizacja 2019: Rspec2 został zmieniony z polecenia „spec” na polecenie „rspec”.


Dzięki, próbowałem tego, ale wystąpił błąd z: $ rake spec spec / controllers / incoming_mails_controller_spec.rb -e "powinno się powieść i zwróci 3 elementy" rake przerwane! (eval): 1: w `standard_rake_options: błąd kompilacji (eval): 1: błąd składni, nieoczekiwany identyfikator TIDENTIFIER, oczekiwanie, że $ end powinno się powieść i zwróci 3 elementy
AnApprentice

Czy zaktualizowałeś aktualne pomysły na pliki specyfikacji?
AnApprentice

Jeśli masz błąd kompilacji, Twoja specyfikacja nie jest poprawna. Upewnij się, że nie brakuje dopo it, contextlub describedeklaracji.
Douglas F Shearer

1
To „spec”, a nie „rake spec”.
muffinista

to powinna być poprawna odpowiedź, odnosząca się do numeru linii jest poważnie niepoprawna - w każdym razie
Eugen Mayer

27

Istnieje wiele opcji:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true

23

Moja preferowana metoda przeprowadzania określonych testów jest nieco inna - dodałem linie

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

Do mojego pliku spec_helper.

Teraz, ilekroć chcę uruchomić jeden konkretny test (lub kontekst lub specyfikację), mogę po prostu dodać do niego znacznik „focus” i uruchomić mój test w normalny sposób - zostaną uruchomione tylko testy zogniskowane. Jeśli usunę wszystkie tagi fokusu, run_all_when_everything_filteredkopie się i uruchomi wszystkie testy jak zwykle.

To nie jest tak szybkie i łatwe jak opcje wiersza poleceń - wymaga edycji pliku dla testu, który chcesz uruchomić. Ale czuję, że daje ci to większą kontrolę.


Zdecydowanie wolę ten styl, ponieważ często uruchamiam testy za pośrednictwem Rubymine / intelliJ. Podoba mi się również ta metoda, ponieważ jest podobna do używania fit / xit w jaśminie / z łykiem
wired00

9

Odpowiedź @apneadiving jest dobrym sposobem na rozwiązanie tego. Jednak teraz mamy nową metodę w Rspec 3.3. Możemy po prostu uruchomić rspec spec/unit/baseball_spec.rb[#context:#it]zamiast używać numeru linii. Zaczerpnięte stąd:

RSpec 3.3 wprowadza nowy sposób identyfikacji przykładów [...]

Na przykład to polecenie:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Uruchomiłby drugi i czwarty przykład lub grupę zdefiniowaną w 1. grupie najwyższego poziomu zdefiniowanej w spec / unit / baseball_spec.rb.

Zamiast więc robić rspec spec/unit/baseball_spec.rb:42to, gdzie jest (test w wierszu 42), jest to pierwszy test, możemy po prostu zrobić rspec spec/unit/baseball_spec.rb[1:1]lub w rspec spec/unit/baseball_spec.rb[1:1:1]zależności od tego, jak zagnieżdżony jest przypadek testowy.


5

W szynach 5

Użyłem tego sposobu do uruchomienia pojedynczego pliku testowego (wszystkie testy w jednym pliku)

rails test -n /TopicsControllerTest/ -v

Nazwę klasy można wykorzystać do dopasowania do żądanego pliku TopicsControllerTest

Moja klasa class TopicsControllerTest < ActionDispatch::IntegrationTest

Wynik :

wprowadź opis zdjęcia tutaj

Jeśli chcesz, możesz dostosować wyrażenie regularne, aby pasowało do pojedynczej metody testowej \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

W przypadku modelu będzie on prowadził skrzynkę tylko na linii nr 5

bundle exec rspec spec/models/user_spec.rb:5

Dla kontrolera: będzie działał tylko na linii nr 5

bundle exec rspec spec/controllers/users_controller_spec.rb:5

W przypadku modelu sygnału lub kontrolera usuń numer linii z góry

Aby uruchomić skrzynkę we wszystkich modelach

bundle exec rspec spec/models

Aby uruchomić przypadek na wszystkich kontrolerach

bundle exec rspec spec/controllers

Aby uruchomić wszystkie sprawy

 bundle exec rspec 

3

Uruchom polecenia z katalogu głównego projektu:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45

1

zaczynając od rspec 2, możesz użyć:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

0

Biorąc pod uwagę, że pracujesz nad projektem Rails 3 z rspec 2, z katalogu głównego rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

powinien zdecydowanie działać. Zmęczyło mnie to pisanie, więc utworzyłem alias, aby skrócić „bundle exec rspec” do „bersp”

„bundle exec” jest tak, że ładuje dokładne środowisko klejnotów określone w pliku gem: http://gembundler.com/

Rspec2 przełączono z polecenia „spec” na polecenie „rspec”.


0

Używam tego klejnotu ochronnego do automatycznego uruchomienia mojego testu. Wykonuje test po utworzeniu lub aktualizacji operacji na pliku testowym.

https://github.com/guard/guard-test

lub zwykle możesz uruchomić za pomocą następującego polecenia

rspec spec / controllers / groups_controller_spec.rb


0

Możesz zrobić coś takiego:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller

0

Możesz użyć

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

numer linii powinien być numerem linii „opisz” lub „to”, aby uruchomić testy obecne w tym konkretnym bloku. zamiast tego wykona wszystkie linie obok numeru_wiersza.

możesz także utworzyć blok o niestandardowej nazwie, a następnie wykonać tylko te bloki.


0

Innym częstym błędem jest nadal posiadanie lub aktualizacja starszej aplikacji Rails do Rails 5+ i umieszczanie require 'spec_helper'na górze każdego pliku testowego. To powinno się zmienić na require 'rails_helper'. Jeśli widzisz inne zachowanie pomiędzy zadaniem rake ( rake spec) a uruchomieniem jednej specyfikacji ( rspec path/to/spec.rb), jest to częsty powód

najlepszym rozwiązaniem jest

1) upewnij się, że używasz require 'rails_helper'u góry każdego pliku specyfikacji - nie w starszym stylu require 'spec_helper' 2) użyj rake spec SPEC=path/to/spec.rbskładni

rspec path/to/spec.rbmyślę, że starszy styl powinien być przez społeczność uznany obecnie za nieaktualny w 2020 r. (ale oczywiście sprawisz, że zadziała, pomijając inne względy)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.