在Test :: More中,是否可以测试最后退出()的子程序?

时间:2017-12-24 23:38:44

标签: perl unit-testing perl-module

我有一个用一些实用函数编写的模块。

其中一个功能只是一个用法声明(由用户@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测试它?

2 个答案:

答案 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();
}

演示:https://ideone.com/AQx395