Exception: Exception
- Defined in:
- lib/cucumber/core_ext/exception.rb
Overview
Exception extension that tweaks Exception backtraces:
-
The line of the failing .feature line is appended to the backtrace
-
The line that calls #cucumber_instance_exec is replaced with the StepDefinition’s regexp
-
Non intersting lines are stripped out
The result is that backtraces look like this:
features/step_definitions/the_step_definition.rb:in `/some step/'
features/the_feature_file.feature:41:in `Given some step'
or if the exception is raised in the tested code:
lib/myapp/some_file.rb:in `/some_method/'
lib/myapp/some_other_file.rb:in `/some_other_method/'
features/step_definitions/the_step_definition.rb:in `/some step/'
features/the_feature_file.feature:41:in `Given some step'
All backtrace munging can be turned off with the --backtrace
switch
Constant Summary collapse
- CUCUMBER_FILTER_PATTERNS =
[ /vendor\/rails|lib\/cucumber|bin\/cucumber:|lib\/rspec|gems\// ]
- INSTANCE_EXEC_OFFSET =
(Cucumber::RUBY_1_9 || Cucumber::JRUBY) ? -3 : -4
Class Method Summary collapse
- .cucumber_full_backtrace=(v) ⇒ Object
-
.cucumber_strip_backtrace!(backtrace, instance_exec_invocation_line, pseudo_method) ⇒ Object
Strips the backtrace from
line
and down.
Class Method Details
.cucumber_full_backtrace=(v) ⇒ Object
28 29 30 |
# File 'lib/cucumber/core_ext/exception.rb', line 28 def self.cucumber_full_backtrace=(v) @@cucumber_full_backtrace = v end |
.cucumber_strip_backtrace!(backtrace, instance_exec_invocation_line, pseudo_method) ⇒ Object
Strips the backtrace from line
and down
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/cucumber/core_ext/exception.rb', line 34 def self.cucumber_strip_backtrace!(backtrace, instance_exec_invocation_line, pseudo_method) return if @@cucumber_full_backtrace instance_exec_pos = backtrace.index(instance_exec_invocation_line) if instance_exec_pos replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method backtrace[replacement_line+1..-1] = nil backtrace.compact! else # This happens with rails, because they screw up the backtrace # before we get here (injecting erb stacktrace and such) end backtrace.reject! do |line| CUCUMBER_FILTER_PATTERNS.detect{|p| line =~ p} end end |