Logo: Relish

  1. Sign in

Project: RSpec Core 3.2

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.

Scenarios
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/really_assert_baz.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 "really_assert_baz"
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/custom_helper.rb:2:in `assert_baz'"
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 "my_gem" containing a file named "lib/my_gem.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/use_my_gem_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/my_gem-1.2.3/lib/my_gem.rb:4:in `do_amazing_things!'"
But
the output from rspec --require spec_helper should not contain "vendor/my_gem-1.2.3/lib/my_gem.rb:4:in `do_amazing_things!'"

Last published almost 4 years ago by myronmarston.