Как я могу подделать STDIN в Perl? - PullRequest
22 голосов
/ 31 июля 2009

Я тестирую модуль, который требует ввода данных пользователем. Как мне сказать 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;

Ответы [ 2 ]

17 голосов
/ 31 июля 2009

Если программа читает с STDIN, тогда просто установите STDIN в качестве открытого дескриптора файла, которым вы хотите, чтобы оно было:

#!perl

use strict;
use warnings;

use Test::More;

*STDIN = *DATA;

my @a = <STDIN>;

is_deeply \@a, ["foo\n", "bar\n", "baz\n"], "can read from the DATA section";

my $fakefile = "1\n2\n3\n";

open my $fh, "<", \$fakefile
    or die "could not open fake file: $!";

*STDIN = $fh;

my @b = <STDIN>;

is_deeply \@b, ["1\n", "2\n", "3\n"], "can read from a fake file";

done_testing; 

__DATA__;
foo
bar
baz

Возможно, вы захотите прочитать больше о typeglobs в perldoc perldata и больше о превращении строк в поддельные файлы в документации по open (смотрите для "Начиная с v5.8.0, perl собирался с использованием PerlIO по умолчанию.") в perldoc perlfunc.

7 голосов
/ 01 августа 2009

Кажется, работает следующий минимальный скрипт:

#!/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 - The object isa TestClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...