Как я могу искупить встроенный оператор backticks Perl?

Я хотел бы unit test программу Perl, использующую обратные ссылки. Есть ли способ обмануть обратные так, чтобы они делали что-то отличное от выполнения внешней команды?

Другой вопрос показывает, что мне нужно, но в Ruby. К сожалению, я не могу использовать Ruby для этого проекта, и я не хочу избегать обратных ссылок.

Ответ 1

Вы можете * высмеять встроенную функцию readpipe. Perl вызовет вашу функцию mock, когда он встретит обратные ссылки или выражение qx.

BEGIN {
  *CORE::GLOBAL::readpipe = \&mock_readpipe
};

sub mock_readpipe {
  wantarray ? ("foo\n") : "foo\n";
}

print readpipe("ls -R");
print `ls -R`;
print qx(ls -R);


$ perl mock-readpipe.pl
foo
foo
foo

* - если у вас perl версия 5.8.9 или новее.

Ответ 2

Вместо использования обратных ссылок вы можете использовать capture из IPC::System::Simple, а затем написать макетную версию capture() в ваш unit test.

# application
use IPC::System::Simple qw(capture);
my $stuff = capture("some command");

# test script
{
     package IPC::System::Simple;
     sub capture
     {
         # do something else; perhaps a call to ok()
     }
}

# ... rest of unit test here