Excluding lines from the backtrace

To reduce the noise when diagnosing failures, RSpec can exclude lines belonging to certain gems or matching given patterns.

If you want to filter out backtrace lines belonging to specific gems, you can use config.filter_gems_from_backtrace like so:

 config.filter_gems_from_backtrace "ignored_gem", "another_ignored_gem", 

For more control over which lines to ignore, you can use the the backtrace_exclusion_patterns option to either replace the default exclusion patterns, or append your own, e.g.

 config.backtrace_exclusion_patterns = [/first pattern/, /second pattern/] config.backtrace_exclusion_patterns << /another pattern/ 

The default exclusion patterns are:

 /\/lib\d*\/ruby\//, /org\/jruby\//, /bin\//, /lib\/rspec\/(core|expectations|matchers|mocks)/ 

Additionally, rspec can be run with the --backtrace option to skip backtrace cleaning entirely.

Using default backtrace_exclusion_patterns

Given a file named “spec/failing_spec.rb” with:

RSpec.describe "2 + 2" do it "is 5" do expect(2+2).to eq(5) end end 

When I run rspec

Then the output should contain “1 example, 1 failure”

And the output should not contain “lib/rspec/expectations”.

Replacing backtrace_exclusion_patterns

Given a file named “spec/spec_helper.rb” with:

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

And a file named “spec/example_spec.rb” with:

require 'spec_helper' RSpec.describe "foo" do it "returns baz" do expect("foo").to eq("baz") end end 

When I run rspec

Then the output should contain “1 example, 1 failure”

And the output should contain “lib/rspec/expectations”.

Appending to backtrace_exclusion_patterns

Given a file named “spec/support/assert_baz.rb” with:

require "support/really_assert_baz" def assert_baz(arg) really_assert_baz(arg) end 

And a file named “spec/support/reallyassertbaz.rb” with:

def really_assert_baz(arg) expect(arg).to eq("baz") end 

And a file named “spec/example_spec.rb” with:

require "support/assert_baz" RSpec.configure do |config| config.backtrace_exclusion_patterns << /really/ end RSpec.describe "bar" do it "is baz" do assert_baz("bar") end end 

When I run rspec

Then the output should contain “1 example, 1 failure”

And the output should contain “assert_baz”

But the output should not contain “reallyassertbaz”

And the output should not contain “lib/rspec/expectations”.

Running rspec with --backtrace prints unfiltered backtraces

Given a file named “spec/support/custom_helper.rb” with:

def assert_baz(arg) expect(arg).to eq("baz") end 

And a file named “spec/example_spec.rb” with:

require "support/custom_helper" RSpec.configure do |config| config.backtrace_exclusion_patterns << /custom_helper/ end RSpec.describe "bar" do it "is baz" do assert_baz("bar") end end 

When I run rspec --backtrace

Then the output should contain “1 example, 1 failure”

And the output should contain “spec/support/customhelper.rb:2:in `assertbaz’”

And the output should contain “lib/rspec/expectations”

And the output should contain “lib/rspec/core”.

Using filter_gems_from_backtrace to filter the named gem

Given a vendored gem named “mygem” containing a file named “lib/mygem.rb” with:

class MyGem def self.do_amazing_things! # intentional bug to trigger an exception impossible_math = 10 / 0 "10 div 0 is: #{impossible_math}" end end 

And a file named “spec/usemygem_spec.rb” with:

require 'my_gem' RSpec.describe "Using my_gem" do it 'does amazing things' do expect(MyGem.do_amazing_things!).to include("10 div 0 is") end end 

And a file named “spec/spec_helper.rb” with:

RSpec.configure do |config| config.filter_gems_from_backtrace "my_gem" end 

Then the output from rspec should contain “vendor/mygem-1.2.3/lib/mygem.rb:4:in `doamazingthings!‘”

But the output from rspec --require spec_helper should not contain “vendor/mygem-1.2.3/lib/mygem.rb:4:in `doamazingthings!’”.