perl - 如何在Perl中伪造STDIN?

标签 perl unit-testing

我正在对需要用户输入的组件进行单元测试。如何告诉 Test::More 使用我预定义的一些输入,这样我就不需要手动输入它了?

这就是我现在所拥有的:

use strict;
use warnings;
use Test::More;
use TestClass;

    *STDIN = "1\n";
    foreach my $file (@files)
    {

#this constructor asks for user input if it cannot find the file (1 is ignore);
    my $test = TestClass->new( file=> @files );

    isa_ok( $test, 'TestClass');
    }


done_testing;

该代码确实按回车键,但是该函数正在检索0而不是1;

最佳答案

以下最小脚本似乎有效:

#!/usr/bin/perl

package TestClass;
use strict;
use warnings;

sub new {
    my $class = shift;
    return unless <STDIN> eq "1\n";
    bless {} => $class;
}

package main;

use strict;
use warnings;

use Test::More tests => 1;

{
    open my $stdin, '<', \ "1\n"
        or die "Cannot open STDIN to read from string: $!";
    local *STDIN = $stdin;
    my $test = TestClass->new;
    isa_ok( $test, 'TestClass');
}

输出:

C:\ Temp> t
1..1
OK 1-对象是TestClass

关于perl - 如何在Perl中伪造STDIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1213986/

相关文章:

linux - 我怎么知道为什么我的 Perl 代码在内核空间 ("sy"中花费这么多时间)?

perl - 探索匿名订阅者的使用

regex - 删除模式前的空行。怎么了?目前使用 Perl 但对 sed/AWK 开放

php - 通过 PHP 或其他服务器端脚本的 VPN 连接?

unit-testing - CakePHP 2.1:使用 Session::read() 制作模拟 Controller

unit-testing - 单元测试和验收测试是否足够?

c# - 将构造函数参数从接口(interface)类型转换为具体类类型在这里是错误的吗?

perl - 检测单行中的第一个或第二个文件

ios - XCode 9 缺少 CoreSimulator.framework

android - Robolectric AsyncTask 回调