From 9d9748aef938a36e16c48bd53c34d195e001ef3c Mon Sep 17 00:00:00 2001 From: "Felipe (laptop)" Date: Tue, 10 Feb 2015 03:15:15 -0600 Subject: [PATCH] Issue #24: Fix errant "skip" message from clobbered $@ in uncaught error. --- lib/Test/Class.pm | 10 +++++----- t/clobbered_EVAL_ERROR.t | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 t/clobbered_EVAL_ERROR.t diff --git a/lib/Test/Class.pm b/lib/Test/Class.pm index fdaf2f3..1359404 100644 --- a/lib/Test/Class.pm +++ b/lib/Test/Class.pm @@ -287,21 +287,21 @@ sub _run_method { } return $is_ok; }; - $skip_reason = eval {$self->$method}; - $skip_reason = $method unless $skip_reason; + my $succeeded = eval { $skip_reason = $self->$method; 1 }; my $exception = $@; + $skip_reason = $method unless $skip_reason; my $num_done = $Builder->current_test - $num_start; my $num_expected = _total_num_tests($self, $method); $num_expected = $num_done if $num_expected eq NO_PLAN; if ($num_done == $num_expected) { - _exception_failure($self, $method, $exception, $tests) - if $exception; + _exception_failure($self, $method, $exception, $tests) + 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"); +}