13

这个问题的答案描述了如何伪造输入到<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

我的问题:

  1. 我怎样才能伪造输入<>
  2. 命令行上没有给出文件<>和没有给出文件有什么区别?<STDIN>(即为什么链接问题中的技术适用于<STDIN>但不适用于<>?)

谢谢。

4

1 回答 1

9

在你的第一个测试中试试这个:

open ARGV, '<', \$fakeinput
      or croak "Cannot open STDIN to read from string: $ERRNO";

my $line = <>;
print "fake1 line is $line\n";

这具有不是“本地”的缺点 - 不知道您是否可以将其设为本地。(您可以多次这样做,每次测试前重置。)

于 2011-06-07T13:36:18.157 回答