Я пересматриваю программу 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
вызов в исходной среде файла.
Хороший ответ здесь от CJM, но позвольте мне поделиться альтернативой кто-то предложил на [PerlMonks] http://perlmonks.org/?node_id=875964: вместо подделки `% INC`, я могу добиться такого же эффекта, предварительно освобождая загрузку модуля. Я просто говорю «использовать Proc :: Background;» в вызывающем коде, переопределить `Proc :: Background :: new`, а затем я могу безопасно сделать свой вызов` do FILE`. – Narveson 2010-12-08 15:26:42
Это может работать, но вы должны быть осторожны. Поскольку вы загружаете настоящий модуль, а затем обезвреживаете его, если вы пропустили что-то, вы должны были заплатить, подлинный код запустится и может сделать то, что вам не нужно. Мой подход предотвращает загрузку реального модуля, поэтому, если вы что-то пропустили, вы получите ошибку «нет такой функции» или что-то в этом роде. – cjm 2010-12-09 00:26:45