Як отримати rspec-2, щоб дати повний трасування, пов’язане з невдалим тестом?


96

Зараз, якщо я запускаю свій тестовий пакет за допомогою, rake specя отримую повідомлення про помилку:

1) SegmentController GET 'індекс' повинен працювати
   Невдача / помилка: отримати "індекс"
   не визначений метод `locale 'для #
   # ./spec/controllers/segments_controller_spec.rb:14:
      у `блоці (3 рівня) в '

Це нормально, оскільки у мене є помилка :)

Проблема полягає в тому, що слід не дуже корисний. Я знаю, що він увірвався segments_controller_spec.rb, рядок 14, але саме тут я називаю тест:

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

Я вважаю за краще мати фактичне розбиття рядків і повну трасування, а не частину в папці специфікацій.

Біг з --traceне допомагає.


2
Перевірте spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering Існує спосіб змінити стандартну фільтрацію зворотного сліду RSpec
Богдан

Відповіді:


244

Ви повинні запустити rspec з -bопцією, щоб побачити повний зворотній шлях


9
Я не розумію, ні цей, ні прийнятий відповідь не дають вам відстань далі від вашого специфікаційного файлу. Або це працює не тільки для мене o_O
janko-m

і fwiw, якщо ви використовуєте rspec із spork і guard, ви можете створити файл .rspec і додати до нього -b, щоб отримати вихідні дані під час запуску тестового набору
shicholas

Це дійсно правильна відповідь - вам не потрібен повний відступ (який включає такі речі, як рейли та rspec та інші дорогоцінні камені) майже весь час - єдиний раз, коли вам це знадобиться, це налагодити чи зрозуміти щось, спричинене дорогоцінним каменем. себе. Тому дотримуйтесь чистих шаблонів за замовчуванням і використовуйте -b у непарному випадку, коли вам це потрібно.
Асфанд Казі,

Він не відображав інформацію про сліди стека про саму помилку. Швидше, він показав стек стежу коштовності rspec
Олександруса

Працює і для RSpec 3
Koen.

29

Ще одна (простіша) альтернатива - відредагувати .rspecфайл та додати backtraceпараметр. Це має виглядати приблизно так:

--colour
--backtrace

Це дасть вам повний зворотний шлях. Сподіваюся, це допомагає.


Так! це саме те, що мені було потрібно. трасування стека до фактичної помилки, а не стека специфікації.
Дієго Салазар

Я вважаю, що відповідний правопис є color. Я думаю, якби ви colour
написали це,

2
Доречно, якщо ви з Америки. У Великобританії пишуть кольорові, а люди rspec такі добрі, що дозволяють обом;)
nathanvda

2
Ось кинув гайковий ключ у капот!
яєчники

3

Це також буде працювати:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end

2

Інший підхід полягає в очищенні всіх моделей відхилення від задніх процесів spec_helper.rb. Найбільше мені подобається це рішення, оскільки я можу зберегти всі параметри RSpec в одному місці та позбутися від .rspec fileявного або явного --backtraceв .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end

Схоже, немає такої опції в rspec 2.x.
Михайло Ягудаєв

1

Я не знаю, як змусити помилку контролера відображатись у rspec. Іноді це з’являється, але я не знаю, в яких умовах воно з’являється. Ось спосіб побачити помилку досить швидко:

Відкрийте ще один термінальний сеанс та запустіть:

tail -f log/test.log

Потім поверніться до сеансу терміналу та запустіть лише специфікацію, в якій була помилка:

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

Поверніться до хвоста журналу, і ви побачите помилку, сподіваємось, не надто багато інших речей, що її оточують (адже ви самі провели невдалий тест).


0

Ще одним варіантом, коли все інше не вдається, є просто додати рятувальний блок і роздрукувати стек, спробувати або додати туди оператор прив'язки і використати show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""

Це іноді найкращий варіант. Просто переконайтеся, що ви видалили його, як тільки ви працюєте. Це повинно обернути місце, де ви очікуєте помилку. Можливо, поставити beginі rescueблок як зовнішній вираз методу дії контролера. Або використовувати rescue_from.
Benjamin Atkin

1
@bat так, це спроба в крайньому випадку, і, як @bat сказав, потрібно видалити, як тільки ви це зрозуміли. Завжди пам’ятайте про те, що git diffперед тим, як зробити це збереже ваш бекон.
Michael Yagudaev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.