Как подделать информацию для оператора Perl?
Ответы на этот вопрос описывают, как подделать <STDIN>
, Моя цель похожа на этот вопрос: мой модульный тест должен подделать ввод <>
,
Когда я применяю ту же технику к фальшивому <>
не работает Вводные объяснения уровня <>
заставил меня поверить, что он читал из STDIN, когда в командной строке не было никаких файлов, но, похоже, это не так.
Образец, который я пытаюсь сделать работу:
#!/usr/bin/perl -w
use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );
sub fake1 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <>;
print "fake1 line is $line\n";
return 0;
}
sub fake2 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <STDIN>;
print "fake2 line is $line\n";
return 0;
}
fake1();
fake2();
fake2
работает, fake1
не. Пример сеанса ("я пишу qwerty"):
$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty
fake2 line is asdf
Мои вопросы:
- Как я могу подделать вход для
<>
? - В чем разница между
<>
а также<STDIN>
когда в командной строке не указаны файлы? (Т.е. почему методика в связанном вопросе работает для<STDIN>
но не для<>
?)
Благодарю.
1 ответ
Решение
Попробуйте это в вашем первом тесте:
open ARGV, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
my $line = <>;
print "fake1 line is $line\n";
Недостатком этого является то, что он не "локальный" - не знаю, можете ли вы сделать его локальным или нет. (Вы можете сделать это несколько раз, сбрасывая перед каждым тестом.)