RSpec более короткий выход задней шины для отказов теста

Я использую RSpec (последняя версия, 2.12.2), чтобы протестировать небольшой класс Ruby, над которым я работаю. Моя проблема заключается в том, что когда RSpec-тест терпит неудачу, тестовый результат кажется невероятно подробным и показывает огромный список сообщений об ошибках, почти то, что кажется полным backtrace. Это означает, что мне нужно прокрутить вверх, чтобы увидеть фактическое сообщение об ошибке и верхнюю часть трассы.

Я считаю, что по умолчанию RSpec должен это делать, но, похоже, он не делает этого для меня. Например, если я запустил rspec spec/my_spec.rb:132 (просто запустите один тест, который на L132), я получаю этот вывод:

 Failure/Error: @f.has_changed?("test").should be_true
   expected: true value
        got: false
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/handler.rb:33:in `handle_matcher'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/syntax.rb:53:in `should'
 # /Users/JackFranklin/Dropbox/Sites/rubygems/filefixtures/spec/filefixtures_spec.rb:137:in `block (4 levels) in <top (required)>'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `instance_eval'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:254:in `with_around_each_hooks'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:111:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:388:in `block in run_examples'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `run_examples'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:369:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/reporter.rb:34:in `report'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:25:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:80:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:17:in `block in autorun'

Который, как вы видите, абсолютно массивный. У меня нет файлов конфигурации RSpec, которые могли бы изменить конфигурацию, переданную RSpec.

Кто-нибудь видел это раньше? Я пробовал Google, но поиски были бесплодны.

Изменить. Затем я настроил конфигурацию, чтобы убедиться, что она применяет очистку по умолчанию:

RSpec.configure do |config|
  # RSpec automatically cleans stuff out of backtraces;
  # sometimes this is annoying when trying to debug something e.g. a gem
  config.backtrace_clean_patterns = [
    /\/lib\d*\/ruby\//,
    /bin\//,
    /gems/,
    /spec\/spec_helper\.rb/,
    /lib\/rspec\/(core|expectations|matchers|mocks)/
  ]
end

Но это не имеет значения. Глядя на результат, он должен иметь большую часть отфильтрованного, но похоже, что конфигурация не применяется?

Изменить еще раз:

В моей конфигурации я даже могу запустить cleaned_from_backtrace?(line), чтобы увидеть, следует ли очищать строку. Это возвращает true:

 config.cleaned_from_backtrace?("/Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'")

Но фактический вывод в терминале остается тем же!

Изменить 3:

Я запускаю RSpec с помощью команды rspec и ничего больше. Файл проекта .rspec содержит:

--color
--format progress

И не существует файла ~/.rspec, который может применяться при настройке.

Ответ 1

Итак, немного поболтав с RSpec folk в Github, мне удалось выследить проблему.

Проблема заключалась в том, что по умолчанию RSpec удаляет строки из backtrace, которые соответствуют Regex/gems/. У меня был проект в папке с gems в названии: ~/Dropbox/rubygems/myproject, поэтому каждая строка backtrace удалялась, и когда это происходит, RSpec разумно показывает вам всю обратную трассировку.

Это объясняет поведение, которое я видел.

Это всегда что-то глупое. Я надеюсь, что если кто-то еще это сделает, возможно, этот ответ спасет их некоторое время.

Ответ 2

Похоже, вы используете RSpec с -b для полной обратной трассировки. Обычно RSpec не будет показывать свою собственную внутреннюю обратную трассировку, даже если ваш тест плохо работает (т.е. Выдает исключение, а не просто отказ от утверждения). Если вы явно не запускаете его с помощью -b или --backtrace, проверьте и убедитесь, что у вас нет этого набора в файле конфигурации .rspec, или что ваша среда IDE или что-то еще не передает его.

Ответ 3

Как сказал Джим, есть опция -b или --backtrace, которая позволит полностью выполнить обратную трассировку. Имейте в виду, что это не просто файл .rspec, который может вызвать его; там также ~/.rspec (для предпочтительных вариантов разработчика).

Другая вещь, которую нужно иметь в виду, - это то, что форматирующий может выплюнуть любую часть обратного хода, которую он хочет. Форматирующие средства предоставляют простой способ для любого стороннего форматирования соблюдать конфигурацию фильтрации backtrace, но вы используете сторонний форматтер, нет гарантии, что он правильно использует это. Используете ли вы один из встроенных форматировщиков rspec?

Наконец, если это не одна из тех вещей, у меня нет идей. Я должен был бы привести пример, чтобы ответить, чтобы ответить на ваш вопрос. Можете ли вы придумать воспроизводимый пример (в принципе, надеюсь)? Я стараюсь регулярно встречаться в канале rspec irc.freenode.net, так что, возможно, вы можете поймать меня там, и мы можем сделать некоторые проблемы с устранением этой проблемы.

Ответ 4

В версии 3.4.0/2015-11-11 можно фильтровать обратную трассировку по опциям:

RSpec.configure do |config|
   config.filter_rails_from_backtrace!
end