如何测试其中包含 'exit' 的子例程 (perl)
how to test a subroutine which has 'exit' in it (perl)
例如:
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 子例程中删除 'exit',它可以工作,但我不想在我的真实环境中这样做案子。我试过:
stdout_is(sub { local $SIG{INT} = sub {}; Dummy::Mod->print_and_exit() }, "Hello World\n", "stdout test");
也不行。
编辑:主要目的是测试该子程序的输出,实际上我不太关心它的退出代码。
您可以使用 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
的作用不仅仅是设在出口处;您还可以使用它来测试 STDOUT
、STDERR
、警告等。
例如:
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 子例程中删除 'exit',它可以工作,但我不想在我的真实环境中这样做案子。我试过:
stdout_is(sub { local $SIG{INT} = sub {}; Dummy::Mod->print_and_exit() }, "Hello World\n", "stdout test");
也不行。
编辑:主要目的是测试该子程序的输出,实际上我不太关心它的退出代码。
您可以使用 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
的作用不仅仅是设在出口处;您还可以使用它来测试 STDOUT
、STDERR
、警告等。