这个问题的答案 https://stackoverflow.com/questions/1213986/how-can-i-fake-stdin-in-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
works, fake1
才不是。示例会话(“qwerty”是我输入的):
$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty
fake2 line is asdf
我的问题:
- 我怎样才能伪造输入
<>
?
- 有什么区别
<>
and <STDIN>
当命令行上没有给出文件时? (即为什么链接问题中的技术适用于<STDIN>
但不是为了<>
?)
Thanks.
在你的第一次测试中试试这个:
open ARGV, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
my $line = <>;
print "fake1 line is $line\n";
这样做的缺点是不是“本地化”——不知道是否可以将其本地化。
(不过,您可以多次执行此操作,并在每次测试前重置。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)