diff --git a/lib/Test/Class.pm b/lib/Test/Class.pm index 3621f87..ed65b17 100644 --- a/lib/Test/Class.pm +++ b/lib/Test/Class.pm @@ -289,8 +289,15 @@ sub _run_method { return $is_ok; }; - my $exception; - $skip_reason = try { $self->$method } catch { $exception = $_; undef }; + my ($exception, $succeeded); + try { + $skip_reason = $self->$method; + $succeeded = 1; + } + catch { + $exception = $_; + }; + $skip_reason = $method unless $skip_reason; my $num_done = $Builder->current_test - $num_start; @@ -298,13 +305,13 @@ sub _run_method { $num_expected = $num_done if $num_expected eq NO_PLAN; if ($num_done == $num_expected) { _exception_failure($self, $method, $exception, $tests) - if $exception; + if !$succeeded; } elsif ($num_done > $num_expected) { my $class = ref $self; $Builder->diag("expected $num_expected test(s) in $class\::$method, $num_done completed\n"); } else { until (($Builder->current_test - $num_start) >= $num_expected) { - if ($exception) { + if (!$succeeded) { _exception_failure($self, $method, $exception, $tests); $skip_reason = "$method died"; $exception = ''; diff --git a/t/clobbered_EVAL_ERROR.t b/t/clobbered_EVAL_ERROR.t new file mode 100644 index 0000000..b2e08d8 --- /dev/null +++ b/t/clobbered_EVAL_ERROR.t @@ -0,0 +1,33 @@ +#!/usr/bin/perl -T + +use strict; +use warnings; +use Test::More tests => 1; +use Test::Builder::Tester; + +package Destroyer; + +sub new { bless {} } + +sub DESTROY { $@ = q<> } + +package Object::Test; +use base qw(Test::Class); +use Test::More; + +sub clobbered_EVAL_ERROR : Test(1) { + for ( Destroyer->new() ) { + die 'haha'; + } +} + +package main; + +test_out(qr/.*died.*/s); +test_err(qr/.*died.*/s); + +Object::Test->runtests; + +END { + test_test("report uncaught exception even if it might be clobbered"); +}