Переопределение модуля, используемого программой, которую я тестирую - PullRequest
2 голосов
/ 08 декабря 2010

Я пересматриваю программу на 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 Ответ

7 голосов
/ 08 декабря 2010
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...