覆盖我正在测试的程序使用的模块

时间:2010-12-08 05:24:45

标签: perl testing

我正在修改一个Perl程序,我想要一个可以运行程序原始版本的测试工具(称之为launch_rockets.pl)并收集标准输出,但不知何故跳过system调用发生在launch_rockets.pl内。以下代码成功覆盖system内的launch_rockets.pl

use subs qw(system);
my $SYSTEM_SUCCESS = 0;
sub system {
    print "***\n";
    print "system @_\n";
    print "***\n\n";
    return $SYSTEM_SUCCESS;
}
local @ARGV = @test_args;
do 'launch_rockets.pl';

到目前为止一切顺利。但launch_rockets.pl也包含

use Proc::Background;

以后

Proc::Background->new('perl', 'launch_missiles.pl');

我可以将launch_rockets.pl复制到沙箱中,其中Proc::Background被存根替换,但我想知道是否有任何覆盖策略在do FILE调用中有效文件的原始环境。

1 个答案:

答案 0 :(得分:7)

use lib '/my/test/library/path';

lib将目录添加到@INC,因此/my/test/library/path/Proc/Background.pm将成为加载的文件。把你想要的任何代码放在那里。

另一种选择是:

{
  package Proc::Background;
  ... # Put stub code here
} # end of package Proc::Background
$INC{'Proc/Background.pm'} = 1; # Make Perl think Proc::Background is loaded