Jak sprawić, by rspec-2 dawał pełny ślad związany z niepowodzeniem testu?

96

W tej chwili, jeśli uruchomię mój zestaw testów za pomocą rake spec, otrzymuję błąd:

1) SegmentsController GET „index” powinien działać
   Niepowodzenie / błąd: pobierz „indeks”
   niezdefiniowana metoda `locale 'dla #
   # ./spec/controllers/segments_controller_spec.rb:14:
      w `bloku (3 poziomy) w '

To normalne, bo mam błąd :)

Problem w tym, że ślad nie jest zbyt pomocny. Wiem, że się włamał segments_controller_spec.rb, wiersz 14, ale tak właśnie nazywam test:

### segments_controller_spec.rb:14
get 'index'

Wolałbym mieć faktyczne łamanie linii i pełny ślad, a nie część w folderze specyfikacji.

Bieganie z --tracenie pomaga.

marcgg
źródło
2
Sprawdź spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering Istnieje sposób na zmianę domyślnego filtrowania wstecznego RSpec
Bohdan

Odpowiedzi:

244

Musisz uruchomić rspec z -bopcją, aby zobaczyć pełne ślady wsteczne

solnic
źródło
9
Nie rozumiem, ani ta, ani zaakceptowana odpowiedź nie dają ci cofnięcia dalej niż z twojego pliku specyfikacji. Albo nie działa tylko na mnie o_O
janko-m
i fwiw jeśli używasz rspec ze spork i guard możesz utworzyć plik .rspec i dodać do niego -b, aby uzyskać wynik po uruchomieniu zestawu testów
shicholas
To jest rzeczywiście poprawna odpowiedź - nie potrzebujesz pełnego śladu wstecznego (obejmującego takie rzeczy jak rails, rspec i inne klejnoty) prawie przez cały czas - jedyny raz, kiedy potrzebujesz, to debugować lub zrozumieć coś spowodowanego przez klejnot samo. Więc trzymaj się domyślnych wzorców czystego śledzenia wstecznego i używaj -b w dziwnych przypadkach, kiedy tego potrzebujesz.
Asfand Qazi
Nie pokazał informacji o śledzeniu stosu o samym błędzie. Raczej pokazał ślad stosu gem rspec
Aleksandrus
Działa również dla RSpec 3
Koen.
29

Inną (łatwiejszą) alternatywą jest edycja .rspecpliku i dodanie backtraceopcji. Powinien wyglądać mniej więcej tak:

--colour
--backtrace

To da ci pełny ślad. Mam nadzieję że to pomoże.

nathanvda
źródło
Tak! to jest dokładnie to, czego potrzebowałem. ślad stosu do rzeczywistego błędu, a nie stos specyfikacji.
DiegoSalazar
Uważam, że odpowiednia pisownia to color. Myślę, że jeśli to przeliterujesz, colourmoże pojawić się żart Monty Pythona
WattsInABox
2
Odpowiednie, jeśli jesteś z Ameryki. W Wielkiej Brytanii piszą w kolorze, a ludzie z rspec są tak mili, że pozwalają na jedno i drugie;)
nathanvda
2
To wrzucono klucz w maskę!
Eggmatters
3

To również zadziała:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end
Maria V
źródło
2

Innym podejściem jest wyczyszczenie wszystkich wzorców wykluczania śledzenia wstecznego w programie spec_helper.rb. Najbardziej podoba mi się to rozwiązanie, ponieważ jestem w stanie zachować wszystkie ustawienia RSpec w jednym miejscu i pozbyć się .rspec filelub jawnie --backtracew .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end
Nowaker
źródło
Wydaje się, że nie ma tej opcji w rspec 2.x.
Michael Yagudaev
1

Nie wiem, jak sprawić, by błąd kontrolera pojawił się w rspec. Czasami się pojawia, ale nie wiem, w jakich warunkach się pojawia. Oto sposób, aby dość szybko zobaczyć błąd:

Otwórz inną sesję terminala i uruchom:

tail -f log/test.log

Następnie wróć do sesji terminala i uruchom specyfikację, w której wystąpił błąd:

bin/rspec -b spec/requests/posts/index_spec.rb

Wróć do końca dziennika i powinieneś zobaczyć błąd, miejmy nadzieję, że bez otaczających go zbyt wielu innych rzeczy (ponieważ sam przeprowadziłeś test zakończony niepowodzeniem).

Benjamin Atkin
źródło
0

Jeszcze jedną opcją, gdy wszystko inne zawiedzie, jest po prostu dodanie bloku ratunkowego i wydrukowanie stosu spróbuj lub dodanie tam wiążącej instrukcji podważenia i użycie show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""
Michael Yagudaev
źródło
Czasami jest to najlepsza opcja. Po prostu pamiętaj, aby go usunąć, gdy zaczniesz działać. Powinien owinąć miejsce, w którym spodziewasz się błędu. Być może umieść beginand rescueblock jako zewnętrzną instrukcję metody działania kontrolera. Lub użyj rescue_from.
Benjamin Atkin
1
@bat tak, jest to próba ostatniej szansy i, jak powiedział @bat, należy ją usunąć, gdy już to zrozumiesz. Zawsze pamiętaj, aby zrobić to git diffprzed podjęciem decyzji, co pozwoli zaoszczędzić bekon.
Michael Yagudaev