You could override the core exit function with a thin wrapper that executes a callback with the logic you want to test. Something like this:
use strict;
use warnings;
use Test::More (tests => 1);
my $exit_callback = sub {};
BEGIN {
*CORE::GLOBAL::exit = sub { $exit_callback->(@_) };
}
my $exit_called = 0;
$exit_callback = sub { $exit_called = 1};
exit;
is($exit_called, 1, "exit was called");
Or you could play with it a bit more and do something like this:
use strict;
use warnings;
use Test::More (tests => 2);
my $exit_callback = sub {};
BEGIN {
*CORE::GLOBAL::exit = sub { $exit_callback->(@_) };
}
sub exit_ok(&$) {
my ($code, $message) = @_;
my $exit_called = 0;
$exit_callback = sub { $exit_called = 1};
$code->();
is($exit_called, 1, $message);
}
sub noexit_ok(&$) {
my ($code, $message) = @_;
my $exit_called = 0;
$exit_callback = sub { $exit_called = 1};
$code->();
is($exit_called, 0, $message);
}
exit_ok {
exit
} "exit called";
noexit_ok {
} "exit not called";