Как я могу искупить встроенный оператор 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