Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit 5bee475

Browse files
committed
Merge pull request #2023 from rspec/handle-errors-with-no-backtrace
Handle errors with no backtrace
2 parents 2f80e77 + ebd7450 commit 5bee475

File tree

9 files changed

+67
-19
lines changed

9 files changed

+67
-19
lines changed

Changelog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ Enhancements:
1717
the number of runs necessary to determine that an example set cannot be
1818
minimized further. (Simon Coffey, #1997)
1919

20+
Bug Fixes:
21+
22+
* Fix formatters to handle exceptions for which `backtrace` returns `nil`.
23+
(Myron Marston, #2023)
24+
2025
### 3.3.1 / 2015-06-18
2126
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.3.0...v3.3.1)
2227

lib/rspec/core/formatters/exception_presenter.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def colorized_message_lines(colorizer=::RSpec::Core::Formatters::ConsoleCodes)
3131
end
3232

3333
def formatted_backtrace
34-
backtrace_formatter.format_backtrace(exception.backtrace, example.metadata)
34+
backtrace_formatter.format_backtrace(exception_backtrace, example.metadata)
3535
end
3636

3737
def colorized_formatted_backtrace(colorizer=::RSpec::Core::Formatters::ConsoleCodes)
@@ -129,7 +129,7 @@ def read_failed_line
129129

130130
def find_failed_line
131131
example_path = example.metadata[:absolute_file_path].downcase
132-
exception.backtrace.find do |line|
132+
exception_backtrace.find do |line|
133133
next unless (line_path = line[/(.+?):(\d+)(|:\d+)/, 1])
134134
File.expand_path(line_path).downcase == example_path
135135
end
@@ -147,6 +147,10 @@ def formatted_message_and_backtrace(colorizer, indentation)
147147
formatted
148148
end
149149

150+
def exception_backtrace
151+
exception.backtrace || []
152+
end
153+
150154
# @private
151155
# Configuring the `ExceptionPresenter` with the right set of options to handle
152156
# pending vs failed vs skipped and aggregated (or not) failures is not simple.

lib/rspec/core/formatters/html_formatter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def percent_done
138138
# produced during the specs.
139139
def extra_failure_content(failure)
140140
RSpec::Support.require_rspec_core "formatters/snippet_extractor"
141-
backtrace = failure.exception.backtrace.map do |line|
141+
backtrace = (failure.exception.backtrace || []).map do |line|
142142
RSpec.configuration.backtrace_formatter.backtrace_line(line)
143143
end
144144
backtrace.compact!

spec/rspec/core/bisect/server_spec.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,26 @@ def run_formatter_specs
6363
run_formatter_specs
6464
end
6565

66-
expect(results).to have_attributes(
67-
:all_example_ids => %w[
66+
aggregate_failures "checking results" do
67+
expect(results.all_example_ids).to eq %w[
6868
./spec/rspec/core/resources/formatter_specs.rb[1:1]
6969
./spec/rspec/core/resources/formatter_specs.rb[2:1:1]
7070
./spec/rspec/core/resources/formatter_specs.rb[2:2:1]
7171
./spec/rspec/core/resources/formatter_specs.rb[3:1]
7272
./spec/rspec/core/resources/formatter_specs.rb[4:1]
7373
./spec/rspec/core/resources/formatter_specs.rb[5:1]
7474
./spec/rspec/core/resources/formatter_specs.rb[5:2]
75-
],
76-
:failed_example_ids => %w[
75+
./spec/rspec/core/resources/formatter_specs.rb[5:3:1]
76+
]
77+
78+
expect(results.failed_example_ids).to eq %w[
7779
./spec/rspec/core/resources/formatter_specs.rb[2:2:1]
7880
./spec/rspec/core/resources/formatter_specs.rb[4:1]
7981
./spec/rspec/core/resources/formatter_specs.rb[5:1]
8082
./spec/rspec/core/resources/formatter_specs.rb[5:2]
83+
./spec/rspec/core/resources/formatter_specs.rb[5:3:1]
8184
]
82-
)
85+
end
8386
end
8487

8588
describe "aborting the run early" do

spec/rspec/core/formatters/documentation_formatter_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ def execution_result(values)
104104
|a failing spec with odd backtraces
105105
| fails with a backtrace that has no file (FAILED - 3)
106106
| fails with a backtrace containing an erb file (FAILED - 4)
107+
| with a `nil` backtrace
108+
| raises (FAILED - 5)
107109
|
108110
|#{expected_summary_output_for_example_specs}
109111
EOS

spec/rspec/core/formatters/html_formatted.html

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ <h1>RSpec Code Examples</h1>
280280
<div id="div_group_1" class="example_group passed">
281281
<dl style="margin-left: 0px;">
282282
<dt id="example_group_1" class="passed">pending spec with no implementation</dt>
283-
<script type="text/javascript">makeYellow('rspec-header');</script><script type="text/javascript">makeYellow('div_group_1');</script><script type="text/javascript">makeYellow('example_group_1');</script><script type="text/javascript">moveProgressBar('14.2');</script><dd class="example not_implemented"><span class="not_implemented_spec_name">is pending (PENDING: Not yet implemented)</span></dd>
283+
<script type="text/javascript">makeYellow('rspec-header');</script><script type="text/javascript">makeYellow('div_group_1');</script><script type="text/javascript">makeYellow('example_group_1');</script><script type="text/javascript">moveProgressBar('12.5');</script><dd class="example not_implemented"><span class="not_implemented_spec_name">is pending (PENDING: Not yet implemented)</span></dd>
284284
</dl>
285285
</div>
286286
<div id="div_group_2" class="example_group passed">
@@ -291,13 +291,13 @@ <h1>RSpec Code Examples</h1>
291291
<div id="div_group_3" class="example_group passed">
292292
<dl style="margin-left: 15px;">
293293
<dt id="example_group_3" class="passed">with content that would fail</dt>
294-
<script type="text/javascript">makeYellow('rspec-header');</script><script type="text/javascript">makeYellow('div_group_3');</script><script type="text/javascript">makeYellow('example_group_3');</script><script type="text/javascript">moveProgressBar('28.5');</script><dd class="example not_implemented"><span class="not_implemented_spec_name">is pending (PENDING: No reason given)</span></dd>
294+
<script type="text/javascript">makeYellow('rspec-header');</script><script type="text/javascript">makeYellow('div_group_3');</script><script type="text/javascript">makeYellow('example_group_3');</script><script type="text/javascript">moveProgressBar('25.0');</script><dd class="example not_implemented"><span class="not_implemented_spec_name">is pending (PENDING: No reason given)</span></dd>
295295
</dl>
296296
</div>
297297
<div id="div_group_4" class="example_group passed">
298298
<dl style="margin-left: 15px;">
299299
<dt id="example_group_4" class="passed">behaves like shared</dt>
300-
<script type="text/javascript">makeRed('rspec-header');</script><script type="text/javascript">makeRed('div_group_4');</script><script type="text/javascript">makeRed('example_group_4');</script><script type="text/javascript">moveProgressBar('42.8');</script><dd class="example pending_fixed">
300+
<script type="text/javascript">makeRed('rspec-header');</script><script type="text/javascript">makeRed('div_group_4');</script><script type="text/javascript">makeRed('example_group_4');</script><script type="text/javascript">moveProgressBar('37.5');</script><dd class="example pending_fixed">
301301
<span class="failed_spec_name">is marked as pending but passes</span>
302302
<span class="duration">n.nnnns</span>
303303
<div class="failure" id="failure_1">
@@ -315,15 +315,15 @@ <h1>RSpec Code Examples</h1>
315315
<div id="div_group_5" class="example_group passed">
316316
<dl style="margin-left: 0px;">
317317
<dt id="example_group_5" class="passed">passing spec</dt>
318-
<script type="text/javascript">moveProgressBar('57.1');</script><dd class="example passed">
318+
<script type="text/javascript">moveProgressBar('50.0');</script><dd class="example passed">
319319
<span class="passed_spec_name">passes</span><span class="duration">n.nnnns</span>
320320
</dd>
321321
</dl>
322322
</div>
323323
<div id="div_group_6" class="example_group passed">
324324
<dl style="margin-left: 0px;">
325325
<dt id="example_group_6" class="passed">failing spec</dt>
326-
<script type="text/javascript">makeRed('div_group_6');</script><script type="text/javascript">makeRed('example_group_6');</script><script type="text/javascript">moveProgressBar('71.4');</script><dd class="example failed">
326+
<script type="text/javascript">makeRed('div_group_6');</script><script type="text/javascript">makeRed('example_group_6');</script><script type="text/javascript">moveProgressBar('62.5');</script><dd class="example failed">
327327
<span class="failed_spec_name">fails</span>
328328
<span class="duration">n.nnnns</span>
329329
<div class="failure" id="failure_2">
@@ -346,7 +346,7 @@ <h1>RSpec Code Examples</h1>
346346
<div id="div_group_7" class="example_group passed">
347347
<dl style="margin-left: 0px;">
348348
<dt id="example_group_7" class="passed">a failing spec with odd backtraces</dt>
349-
<script type="text/javascript">makeRed('div_group_7');</script><script type="text/javascript">makeRed('example_group_7');</script><script type="text/javascript">moveProgressBar('85.7');</script><dd class="example failed">
349+
<script type="text/javascript">makeRed('div_group_7');</script><script type="text/javascript">makeRed('example_group_7');</script><script type="text/javascript">moveProgressBar('75.0');</script><dd class="example failed">
350350
<span class="failed_spec_name">fails with a backtrace that has no file</span>
351351
<span class="duration">n.nnnns</span>
352352
<div class="failure" id="failure_3">
@@ -355,7 +355,7 @@ <h1>RSpec Code Examples</h1>
355355
<pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for (erb)</span></code></pre>
356356
</div>
357357
</dd>
358-
<script type="text/javascript">moveProgressBar('100.0');</script><dd class="example failed">
358+
<script type="text/javascript">moveProgressBar('87.5');</script><dd class="example failed">
359359
<span class="failed_spec_name">fails with a backtrace containing an erb file</span>
360360
<span class="duration">n.nnnns</span>
361361
<div class="failure" id="failure_4">
@@ -366,7 +366,21 @@ <h1>RSpec Code Examples</h1>
366366
</dd>
367367
</dl>
368368
</div>
369-
<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>n.nnnn seconds</strong>";</script><script type="text/javascript">document.getElementById('totals').innerHTML = "7 examples, 4 failures, 2 pending";</script>
369+
<div id="div_group_8" class="example_group passed">
370+
<dl style="margin-left: 15px;">
371+
<dt id="example_group_8" class="passed">with a `nil` backtrace</dt>
372+
<script type="text/javascript">makeRed('div_group_8');</script><script type="text/javascript">makeRed('example_group_8');</script><script type="text/javascript">moveProgressBar('100.0');</script><dd class="example failed">
373+
<span class="failed_spec_name">raises</span>
374+
<span class="duration">n.nnnns</span>
375+
<div class="failure" id="failure_5">
376+
<div class="message"><pre>boom</pre></div>
377+
<div class="backtrace"><pre></pre></div>
378+
<pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for </span></code></pre>
379+
</div>
380+
</dd>
381+
</dl>
382+
</div>
383+
<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>n.nnnn seconds</strong>";</script><script type="text/javascript">document.getElementById('totals').innerHTML = "8 examples, 5 failures, 2 pending";</script>
370384
</div>
371385
</div>
372386
</body>

spec/rspec/core/formatters/progress_formatter_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
output.gsub!(/ +$/, '') # strip trailing whitespace
4747

4848
expect(output).to eq(<<-EOS.gsub(/^\s+\|/, ''))
49-
|**F.FFF
49+
|**F.FFFF
5050
|
5151
|#{expected_summary_output_for_example_specs}
5252
EOS

spec/rspec/core/resources/formatter_specs.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,12 @@ def e.message
5757

5858
raise e
5959
end
60+
61+
context "with a `nil` backtrace" do
62+
it "raises" do
63+
raise "boom"
64+
end
65+
66+
after { |ex| ex.exception.set_backtrace(nil) }
67+
end
6068
end

spec/support/formatter_support.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,21 @@ def expected_summary_output_for_example_specs
9090
| Exception
9191
| # /foo.html.erb:1:in `<main>': foo (RuntimeError)
9292
|
93+
| 5) a failing spec with odd backtraces with a `nil` backtrace raises
94+
| Failure/Error: Unable to find matching line from backtrace
95+
| RuntimeError:
96+
| boom
97+
|
9398
|Finished in n.nnnn seconds (files took n.nnnn seconds to load)
94-
|7 examples, 4 failures, 2 pending
99+
|8 examples, 5 failures, 2 pending
95100
|
96101
|Failed examples:
97102
|
98103
|rspec ./spec/rspec/core/resources/formatter_specs.rb:4 # pending command with block format behaves like shared is marked as pending but passes
99104
|rspec ./spec/rspec/core/resources/formatter_specs.rb:32 # failing spec fails
100105
|rspec ./spec/rspec/core/resources/formatter_specs.rb:38 # a failing spec with odd backtraces fails with a backtrace that has no file
101106
|rspec ./spec/rspec/core/resources/formatter_specs.rb:44 # a failing spec with odd backtraces fails with a backtrace containing an erb file
107+
|rspec ./spec/rspec/core/resources/formatter_specs.rb:62 # a failing spec with odd backtraces with a `nil` backtrace raises
102108
EOS
103109
end
104110
else
@@ -158,15 +164,21 @@ def expected_summary_output_for_example_specs
158164
| Exception
159165
| # /foo.html.erb:1:in `<main>': foo (RuntimeError)
160166
|
167+
| 5) a failing spec with odd backtraces with a `nil` backtrace raises
168+
| Failure/Error: Unable to find matching line from backtrace
169+
| RuntimeError:
170+
| boom
171+
|
161172
|Finished in n.nnnn seconds (files took n.nnnn seconds to load)
162-
|7 examples, 4 failures, 2 pending
173+
|8 examples, 5 failures, 2 pending
163174
|
164175
|Failed examples:
165176
|
166177
|rspec ./spec/rspec/core/resources/formatter_specs.rb:4 # pending command with block format behaves like shared is marked as pending but passes
167178
|rspec ./spec/rspec/core/resources/formatter_specs.rb:32 # failing spec fails
168179
|rspec ./spec/rspec/core/resources/formatter_specs.rb:38 # a failing spec with odd backtraces fails with a backtrace that has no file
169180
|rspec ./spec/rspec/core/resources/formatter_specs.rb:44 # a failing spec with odd backtraces fails with a backtrace containing an erb file
181+
|rspec ./spec/rspec/core/resources/formatter_specs.rb:62 # a failing spec with odd backtraces with a `nil` backtrace raises
170182
EOS
171183
end
172184
end

0 commit comments

Comments
 (0)