我有一个用一些实用函数编写的模块。
其中一个功能只是一个用法声明(由用户@zdim推荐)
use 5.008_008;
use strict;
use warnings;
# Function Name: 'usage'
# Function Inputs: 'none'
# Function Returns: 'none'
# Function Description: 'Prints usage on STDERR, for when invalid options are passed'
sub usage ## no critic qw(RequireArgUnpacking)
{
require File::Basename;
my $PROG = File::Basename::basename($0);
for (@_)
{
print {*STDERR} $_;
}
print {*STDERR} "Try $PROG --help for more information.\n";
exit 1;
}
我知道子程序按预期工作,并且它很容易测试,但是......对于覆盖率报告,我想将它包含在我的单元测试中。
有没有办法使用Test::More
测试它?
答案 0 :(得分:15)
您可以使用Test::Exit。
如果由于任何原因您无法使用它,请复制以下代码:
our $exit_handler = sub {
CORE::exit $_[0];
};
BEGIN {
*CORE::GLOBAL::exit = sub (;$) {
$exit_handler->(@_ ? 0 + $_[0] : 0)
};
}
{
my $exit = 0;
local $exit_handler = sub {
$exit = $_[0];
no warnings qw( exiting );
last TEST;
};
TEST: {
# Your test here
}
cmp_ok($exit, '==', 1, "exited with 1");
}
确保在BEGIN块之后加载模块。
答案 1 :(得分:2)
或者,您可以使用END块来处理退出呼叫。
在END代码块中,$?包含程序的值 要传递到exit()。你可以修改$?改变退出的价值 该计划。
usage();
END {
use Test::More;
ok($?);
done_testing();
}