100

Right now if I run my test suite using rake spec I get an error:

1) SegmentsController GET 'index' should work
   Failure/Error: get 'index'
   undefined method `locale' for #
   # ./spec/controllers/segments_controller_spec.rb:14:
      in `block (3 levels) in '

This is normal as I do have an error :)

The problem is that the trace isn't very helpful. I know it broke in segments_controller_spec.rb, line 14, but this is just where I call the test:

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

I would prefer to have the actual line breaking and the complete trace, not the part in the spec folder.

Running with --trace doesn't help.

John Bachir
  • 22,495
  • 29
  • 154
  • 227
marcgg
  • 65,020
  • 52
  • 178
  • 231
  • 2
    Check http://spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering/ There is a way to change default RSpec backtrace filtering – Bohdan Oct 04 '11 at 14:12

6 Answers6

251

You must run rspec with -b option to see full backtraces

Dorian
  • 22,759
  • 8
  • 120
  • 116
solnic
  • 5,733
  • 2
  • 23
  • 19
  • 11
    I don't get it, neither this or the accepted answer give you backtrace further then from your spec file. Or it doesn't work only for me o_O – Janko Sep 04 '12 at 16:16
  • and fwiw if you use rspec with spork and guard you can create a .rspec file and add -b to it to get the output when you run your test suite – shicholas Mar 05 '13 at 21:20
  • This is indeed the correct answer - you don't need the full backtrace (that includes stuff like rails and rspec and other gems) almost all of the time - the only time you ever need it is to debug or understand something caused by the gem itself. So stick to the default backtrace clean patterns, and use -b in the odd case when you need it. – Asfand Qazi May 16 '13 at 09:45
  • 1
    It didn't show stack trace info about the error itself. Rather, it showed the stack trace of the rspec gem – Aleksandrus Jun 24 '16 at 02:08
  • Works for RSpec 3 as well – Koen. Aug 11 '16 at 16:22
29

Another (easier) alternative is to edit the .rspec file, and add the backtrace option. It should look somewhat like this:

--colour
--backtrace

That will give you the full backtrace. Hope this helps.

nathanvda
  • 49,707
  • 13
  • 117
  • 139
6

This will also work:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end
Maria V
  • 81
  • 1
  • 2
2

Another approach is to clear all backtrace exclusion patterns in spec_helper.rb. I like this solution most as I'm able to keep all RSpec settings in one place and get rid of .rspec file or explicit --backtrace in .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end
Nowaker
  • 12,154
  • 4
  • 56
  • 62
1

I don't know how to get the controller error to show up in rspec. Sometimes it shows up but I don't know what conditions cause it to show up. Here is a way to see the error fairly quickly though:

Open another terminal session and run:

tail -f log/test.log

Then go back to the terminal session and run just the spec that had the error:

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

Go back to the tail of the log and you should see the error, hopefully without too much other stuff surrounding it (because you ran the failing test by itself).

Benjamin Atkin
  • 14,071
  • 7
  • 61
  • 60
0

One more option when all else fails is to just add a rescue block and print out the stack try or add a binding pry statement there and use show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""
Michael Yagudaev
  • 6,049
  • 3
  • 48
  • 53
  • This is sometimes the best option. Just make sure you remove it once you get it working. It should wrap the place where you expect the error to be. Perhaps put the `begin` and `rescue` block as the outer statement of the controller's action method. Or use `rescue_from`. – Benjamin Atkin Sep 23 '14 at 04:15
  • 1
    @bat yes this is a last resort attempt and like @bat said needs to be removed once you figured it out. Always remember to do your `git diff` before committing it will save your bacon. – Michael Yagudaev Sep 30 '14 at 01:05