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的作品,假的没有.一个示例会话(“qwerty”是我打字):
$perl /tmp/diamond.pl qwerty fake1 line is qwerty fake2 line is asdf
我的问题:
>我如何将输入输入到<>?
><>之间有什么区别?和< STDIN>当命令行上没有提供任何文件时? (即,为什么链接的问题中的技术可以用于< STDIN>但不适用于<>?)
谢谢.
解决方法
在您的第一个测试中尝试这样做:
open ARGV,\$fakeinput or croak "Cannot open STDIN to read from string: $ERRNO"; my $line = <>; print "fake1 line is $line\n";
这不利于不是“本地” – 不知道如果你可以使其本地化.(您可以做几次,但每次测试之前重置)