2010-12-08 5 views
2

Я пересматриваю программу 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 заменяется заглушкой, но мне было интересно, есть ли переопределение стратегия, которая была бы эффективна в a do FILE вызов в исходной среде файла.

+0

Хороший ответ здесь от CJM, но позвольте мне поделиться альтернативой кто-то предложил на [PerlMonks] http://perlmonks.org/?node_id=875964: вместо подделки `% INC`, я могу добиться такого же эффекта, предварительно освобождая загрузку модуля. Я просто говорю «использовать Proc :: Background;» в вызывающем коде, переопределить `Proc :: Background :: new`, а затем я могу безопасно сделать свой вызов` do FILE`. – Narveson 2010-12-08 15:26:42

+1

Это может работать, но вы должны быть осторожны. Поскольку вы загружаете настоящий модуль, а затем обезвреживаете его, если вы пропустили что-то, вы должны были заплатить, подлинный код запустится и может сделать то, что вам не нужно. Мой подход предотвращает загрузку реального модуля, поэтому, если вы что-то пропустили, вы получите ошибку «нет такой функции» или что-то в этом роде. – cjm 2010-12-09 00:26:45

ответ

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 
Смежные вопросы