perl - 如何伪造 Perl 钻石运算符的输入?

标签 perl unit-testing io diamond-operator

The answers to this question描述如何伪造 <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才不是。示例 session (“qwerty”是我输入的):

$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty

fake2 line is asdf

我的问题:

  1. 如何伪造 <> 的输入?
  2. <> 之间有什么区别和<STDIN>当命令行上没有给出文件时? (即为什么链接问题中的技术适用于 <STDIN> 但不适用于 <>?)

谢谢。

最佳答案

在第一次测试中尝试一下:

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

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

这有一个缺点,那就是不是“本地化”——不知道是否可以将其本地化。 (不过,您可以多次执行此操作,并在每次测试之前重置。)

关于perl - 如何伪造 Perl 钻石运算符的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265790/

相关文章:

perl - 为什么Win32::OLE在Win2003下不能与Excel2003对话?

unit-testing - 将 SWI-Prolog 代码构建到模块中,用于多个算法和数据集的单元测试

perl - 当 perl 中的键相同时连接哈希值

Perl - 具有修改后数据的新哈希项,源自另一个条目的馈线哈希,破坏了第一个条目

java - 单元测试 RestController 确实返回不在 ResponseEntity 内的强类型对象

unit-testing - 代码覆盖是否应该考虑由短路引起的代码分支?

java - Java中如何将二进制数据写入文件?

c - 使用 C 语言结构进行文件 I/O 提取

c - 为什么要跳过 getchar()?

javascript - WWW::Mechanize::Firefox 单击某个类的所有图像