If you don't want to install Test::Exception (or don't want to rely on it), you can do the same kind of thing manually without too much trouble.
use English '-no_match_vars';
eval { possible_exception_thrower() };
ok( ! $EVAL_ERROR, 'possible_exception_thrower() threw nothing' );
eval { this_should_die() };
ok( $EVAL_ERROR, 'this_should_die() did die' );
like( $EVAL_ERROR, qr/exceptional error text/,
'this_should_die() died for the expected reason );
You can use the __WARN__ "signal handler" to check if your code warns the way you want.
{
my $warning;
local $SIG{__WARN__} = sub { $warning = shift };
is( $warning, undef, 'no warnings recorded' );
code_that_warns();
is( $warning, 'expected warning',
'code_that_warns() does indeed warn' );
$warning = undef;
non_warning_code();
is( $warning, undef, 'non_warning_code() is clean' );
}
If you're going to be pitching (and testing for) more than one warning, then the warning handler should push into an array that you can test against.