Jak uruchomić pojedynczy plik testu / specyfikacji w RSpec?

282

Chcę być w stanie przeprowadzić testy jednego pliku specyfikacji - na przykład dla jednego pliku, który edytuję. rake specwykonuje wszystkie specyfikacje. Mój projekt nie jest projektem Rails, więc rake spec:docnie działa.

Nie wiem, czy to ma znaczenie, ale oto moja struktura katalogów.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb
Jonathan Tran
źródło

Odpowiedzi:

392

Możesz też pominąć rake i użyć polecenia „rspec”:

rspec path/to/spec/file.rb

W twoim przypadku myślę, że o ile plik ./spec/db_spec.rb zawiera odpowiednie pomocniki, powinien działać dobrze.

Jeśli używasz starszej wersji rspec, jest to:

spec path/to/spec/file.rb
Cameron Booth
źródło
31
z nowym rspec musisz użyć „rspec path / to / file.rb”
djburdick
3
Może robię to źle, ale muszę zrobić „bundle exec rspec path / to / spec / file.rb”
andrhamm
2
Jeśli używasz Railsów, prawdopodobnie będziesz chciał wykonać swoje specyfikacje przy użyciu Rake, aby mieć pewność, że zaczynasz od pustej bazy danych.
superluminarny
@andrhamm, po prostu uruchamiasz swoje specyfikacje w kontekście pakietu. Jest to konieczne, jeśli nie używasz zestawów gemów (które są domyślnie dostarczane z rvm i są osobnym rozszerzeniem do rbenv)
Caleb
6
Jeśli chcesz uruchomić tylko jeden test, do pliku dołączasz numer linii początku testu. Przykład: rspec path / to / spec / file.rb: 455
runamok
201

Surowe wywołanie:

rake spec SPEC = spec / kontrolery / session_controller_spec.rb \
          SPEC_OPTS = "- e \" powinien zalogować się przy użyciu pliku cookie \ ""

Teraz wymyśl, jak osadzić to w swoim edytorze.

mislav
źródło
1
Jak powiedziałem, nie jestem w szynach, więc nie ma kontrolerów. Ale tak, działa funkcja „rake spec SPEC = plik.rb”. Dzięki! Pracuję teraz nad integracją Emacsa.
Jonathan Tran
5
Nie uruchamiaj rakefile, jeśli możesz tego uniknąć. Zajmuje to cholerny wiek
Orion Edwards
2
Zmieniłem zaakceptowaną odpowiedź, ale parametr SPEC_OPTS również był dla mnie pomocny.
Jonathan Tran
2
To właśnie nazywam dobrą odpowiedzią. Dlaczego nie jest oznaczone jako „Odpowiedź”?
gmile
1
Bezpośrednie uruchomienie specyfikacji jest często najlepszym wyborem, ale wiele razy musisz uruchomić prowizję na różne magiczne bity w niestandardowym pliku Rakefile
Nerdmaster
124

To pytanie jest stare, ale pojawia się u góry Google, gdy szukasz sposobu na uruchomienie pojedynczego testu. Nie wiem, czy jest to najnowszy dodatek, ale aby uruchomić pojedynczy test ze specyfikacji, możesz wykonać następujące czynności:

rspec path/to/spec:<line number>

gdzie -line number- to numer linii, który zawiera część twojego testu. Na przykład, jeśli masz specyfikację taką jak:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Powiedzmy, że jest zapisany w spec / models / foo_spec.rb. Wtedy biegniesz:

rspec spec/models/foo_spec.rb:2

i wystarczyłoby uruchomić tę jedną specyfikację. W rzeczywistości liczba ta może wynosić od 2 do 5.

Mam nadzieję że to pomoże!

juanpaco
źródło
Jest to interesujące, chociaż wygląda na to, że nie działa po ponownym przekształceniu specyfikacji w wiele plików (tzn. Można jej używać tylko z głównym plikiem _spec.rb, ale jeśli nie ma w nim żadnego z przykładów, nic nie uruchomi) . Również jeśli spróbujesz użyć go do pliku, który nie jest plikiem specyfikacji najwyższego poziomu, to również nic nie uruchomi.)
Trejkaz
Nie do końca podążam. Co rozumiesz przez „plik specyfikacji najwyższego poziomu”? Mój zestaw testów jest prawie zawsze podzielony na kilka plików i za pomocą tej metody zawsze mogę wywoływać testy w jednym pliku. Czy masz na myśli plik, który requirejest twoimi innymi plikami specyfikacji?
juanpaco
Mogę tego użyć na dowolnym pliku na dowolnym poziomie w katalogu spec /. Uważam, że Trejkaz jest niepoprawny.
Michael Durrant
7
to jest niesamowite i powinno być na topie!
Tommaso Barbugli
4
Używam tego cały czas, ale czasami chcesz uruchomić kilka testów z jednego pliku. Następnie możesz wpisać wszystkie takie przykłady:rspec spec/models/foo_spec.rb:2:12:49
swilgosz
61

Możesz także użyć rzeczywistego tekstu przypadku testowego * e * xample za pomocą -e!

Więc dla:

it "shows the plane arrival time"

możesz użyć

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

nie trzeba tutaj grabić.

tcurdt
źródło
To wszystko, czego potrzebujesz, z wyjątkiem tego, że „spec” należy zastąpić „rspec”, jak stwierdzono @bandhunt
Nicolas Wormser
19

z pomocy (spec -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Przykład: spec spec / runner_spec.rb -l 162

Boblin
źródło
3
W nowszych wersjach Rspec dodajesz numer wiersza po dwukropku :zgodnie z dokumentacją i popularną odpowiedzią.
dragon788
13

Jeśli zainstalowałeś rspec jako wtyczkę, a nie klejnot, nie będziesz mieć specpliku wykonywalnego.

W każdym razie wszystko, co musisz zrobić, to uruchomić plik za pomocą ruby. Kod rspec jest wystarczająco sprytny, aby przeprowadzić dla Ciebie testy.

na przykład:

ruby myclass_spec.rb
Orion Edwards
źródło
2
Czy możliwe jest uruchomienie jednego testu w takim pliku?
Ian Vaughan
12

http://github.com/grosser/single_test pozwala robić rzeczy takie jak ..

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last
Zeke
źródło
Wygląda na to, że klejnot nie został zachowany, ostatnie zatwierdzenie nastąpiło 5 lat temu!
thegreendroid
10

Ruby 1.9.2 i Rails 3 mają łatwy sposób na uruchomienie jednego pliku specyfikacji:

  ruby -I spec spec / models / user_spec.rb

Wyjaśnienie:

  • rubypolecenie wydaje się być szybsze niż rakepolecenie
  • -I spec oznacza „dołącz katalog„ spec ”podczas wyszukiwania plików”
  • spec/models/user_spec.rb to plik, który chcemy uruchomić.
joelparkerhenderson
źródło
Czy możesz uruchomić jeden test w tym pliku z dodatkowymi opcjami?
Ian Vaughan
10

Aby uruchomić wszystkie pliki rspec:rspec

Uwaga: musisz być w katalogu głównym swojego projektu

Aby uruchomić jeden plik rspec:rspec 'path_to/spec.rb'

Uwaga: zamień „path_to / spec.rb” na swoją ścieżkę. Cudzysłowy są opcjonalne.

Aby uruchomić jeden test rspec z jednego pliku:rspec 'path_to/spec.rb:7'

Uwaga: 7 to numer linii, od której rozpoczyna się test

nflauria
źródło
5

Miałem problem z uruchomieniem któregokolwiek z tych przykładów, może dlatego, że post jest stary, a polecenia się zmieniły?

Po kilku pogawędkach odkryłem, że działa:

rspec spec / models / user_spec.rb

To uruchomi tylko jeden plik i zapewni przydatne dane wyjściowe w terminalu.

Greg Hemphill
źródło
Zostało to wspomniane w komentarzu w zaakceptowanej odpowiedzi. Tak, myślę, że ten post jest tak stary, że zmieniła się nazwa polecenia.
Jonathan Tran
3

Alternatywnie, spójrz na autotest.

Uruchomienie autotestu w oknie poleceń oznacza, że ​​plik specyfikacji będzie wykonywany za każdym razem, gdy go zapiszesz. Będzie on także uruchamiany za każdym razem, gdy uruchamiany jest plik, który określasz.

Na przykład, jeśli masz plik specyfikacji modelu o nazwie person_spec.rb i plik modelu, który określa, o nazwie person.rb, to za każdym razem, gdy zapiszesz jeden z tych plików w edytorze, plik spec zostanie wykonany.

fatgeekuk
źródło
3

Chociaż na to pytanie napisano wiele świetnych odpowiedzi, żadna z nich nie używa Rspectags podejścia .

Używam tagów do uruchamiania jednej lub więcej specyfikacji w różnych plikach - tylko tych związanych z moim bieżącym zadaniem programistycznym.

Na przykład dodaję tag „dev” o wartości „current”:

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

wtedy biegnę

bundle exec rspec . --tag dev:current

Różne tagi / wartości można ustawić w poszczególnych specyfikacjach lub grupach.

Victor BV
źródło
2

Powiedzmy, że przeprowadzasz test tworzenia todo. Zawsze możesz uruchomić ten konkretny kod specyfikacji todo, używając pliku crete_spec.rb jak poniżej.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Jeśli chcesz uruchomić wszystkie specyfikacje w jednym krótkim skrócie.

   rspec 

Jeśli chcesz uruchomić wszystkie specyfikacje dla określonego użytkownika kontrolera, to.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

Mam nadzieję, że daje to więcej zrozumienia!

Prabhakar Undurthi
źródło