Как заставить rspec-2 давать полную трассировку, связанную с ошибкой теста?

96

Прямо сейчас, если я запускаю свой набор тестов, rake specя получаю сообщение об ошибке:

1) SegmentsController GET 'index' должен работать
   Отказ / ошибка: получить индекс
   undefined метод `locale 'для #
   # ./spec/controllers/segments_controller_spec.rb:14:
      в `блоке (3 уровня) в '

Это нормально, у меня есть ошибка :)

Проблема в том, что трассировка не очень полезна. Я знаю, что это сломалось segments_controller_spec.rb, строка 14, но именно здесь я вызываю тест:

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

Я бы предпочел иметь фактический разрыв строки и полную трассировку, а не часть в папке спецификации.

Бежать с --traceпомощью не помогает.

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

Ответы:

244

Вы должны запустить rspec с -bопцией, чтобы увидеть полную трассировку

солник
источник
9
Я не понимаю, ни этот, ни принятый ответ не дают вам трассировки дальше от вашего файла спецификации. Или не работает только у меня
о_О
и fwiw, если вы используете rspec с spork и guard, вы можете создать файл .rspec и добавить к нему -b, чтобы получить результат при запуске вашего набора тестов
shicholas
Это действительно правильный ответ - вам не нужна полная обратная трассировка (которая включает в себя такие вещи, как rails, rspec и другие драгоценные камни) почти все время - единственный раз, когда вам это когда-либо понадобится, это отладить или понять что-то, вызванное гемом сам. Так что придерживайтесь шаблонов очистки обратной трассировки по умолчанию и используйте -b в нечетном случае, когда вам это нужно.
Асфанд Кази
Он не отображал информацию трассировки стека о самой ошибке. Скорее, он показал след стека драгоценного камня rspec
Александрус
Также работает для RSpec 3
Koen.
29

Другой (более простой) вариант - отредактировать .rspecфайл и добавить backtraceопцию. Это должно выглядеть примерно так:

--colour
--backtrace

Это даст вам полную трассировку. Надеюсь это поможет.

Натанвда
источник
Да! это именно то, что мне было нужно. трассировка стека до фактической ошибки, а не до стека спецификаций.
DiegoSalazar
Я считаю правильное написание color. Я думаю, если вы произнесете это по буквам, colourможет появиться шутка о Монти
Пайтоне
2
Подходит, если вы из Америки. В Великобритании пишут цветом, и ребята из rspec так любезны, что разрешают и то, и другое;)
nathanvda
2
Вот это гаечный ключ в капоте!
eggmatters
3

Это также будет работать:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end
Мария V
источник
2

Другой подход - очистить все шаблоны исключения трассировки в файлах spec_helper.rb. Мне нравится этот раствор больше всего как я могу сохранить все настройки RSpec в одном месте и избавиться от .rspec fileили неявными --backtraceв .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end
Nowaker
источник
Похоже, такой опции нет в rspec 2.x.
Михаил Ягудаев
1

Я не знаю, как сделать так, чтобы ошибка контроллера отображалась в rspec. Иногда он появляется, но я не знаю, при каких условиях это появляется. Вот способ довольно быстро увидеть ошибку:

Откройте другой сеанс терминала и запустите:

tail -f log/test.log

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

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

Вернитесь в конец журнала, и вы должны увидеть ошибку, надеюсь, без особых других вещей, окружающих ее (потому что вы выполнили неудачный тест сам по себе).

Бенджамин Аткин
источник
0

Еще один вариант, когда все остальное не работает, - просто добавить блок восстановления и распечатать стек, попробуйте или добавьте туда оператор привязки pry и используйте show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""
Михаил Ягудаев
источник
Иногда это лучший вариант. Просто убедитесь, что вы удалили его, когда он заработает. Он должен обернуть то место, где вы ожидаете ошибку. Возможно поставить beginи rescueблок в качестве внешнего оператора способа действия контроллера. Или используйте rescue_from.
Бенджамин Аткин
1
@bat да, это последняя попытка, и, как сказал @bat, ее нужно удалить, как только вы это выясните. Всегда не забывайте делать это git diffперед тем, как совершить это, это спасет ваш бекон.
Михаил Ягудаев