如何测试一个退出'退出的子程序在它(perl)

时间:2015-02-06 04:00:08

标签: perl unit-testing

例如:

dummy_mod.pl

package Dummy::Mod;

use warnings;
use strict;

sub print_and_exit {
    print "Hello World\n";
    exit;
}
1;

dummy_mod.t

use warnings;
use strict;

use Test::More;
use Test::Output;

plan tests => 2;
ok(require('dummy_mod.pl'), 'load test') or exit;
stdout_is(sub { Dummy::Mod->print_and_exit() }, "Hello World\n", "stdout test");

然后我得到了:

$ perl dummy_mod.t
1..2
ok 1 - load test
# Looks like you planned 2 tests but ran 1.

所以似乎测试脚本在测试#2完成之前退出。如果我删除' 退出'从 print_and_exit 子程序,它可以工作,但我不想在我的实际案例中这样做。我试过了:

stdout_is(sub { local $SIG{INT} = sub {}; Dummy::Mod->print_and_exit() }, "Hello World\n", "stdout test");

它也不起作用。

编辑:主要目的是测试该子例程的输出,实际上我并不关心它的退出代码。

1 个答案:

答案 0 :(得分:3)

您可以使用Test::Trap。以下是文档中概要的示例:

use Test::More;
use Test::Trap;

my @r = trap { some_code(@some_parameters) };
is ( $trap->exit, 1, 'Expecting &some_code to exit with 1' );
is ( $trap->stdout, '', 'Expecting no STDOUT' );

请注意Test::Trap不只是捕获退出;您还可以使用它来测试STDOUTSTDERR,警告等。