如何单元测试打印到屏幕的Perl函数?

前端之家收集整理的这篇文章主要介绍了如何单元测试打印到屏幕的Perl函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用 Test::More单位测试Perl功能打印到屏幕。

我知道这个输出可能会干扰工具,如prove

我如何捕获这个输出,所以我可以打印它与diag(),并且还运行测试输出本身?

解决方法

更新:IMHO,这个问题的正确答案应该是使用 Test::Output
#!/usr/bin/perl

use strict; use warnings;

use Test::More tests => 1;
use Test::Output;

sub myfunc { print "This is a test\n" }

stdout_is(\&myfunc,"This is a test\n",'myfunc() returns test output');

输出

C:\Temp> tm
1..1
ok 1 - myfunc() returns test output

我离开原来的答案供参考,我相信,它仍然说明一个有用的技术。

您可以本地化STDOUT并在调用函数之前重新打开标量,然后恢复:

#!/usr/bin/perl

use strict; use warnings;

use Test::More tests => 1;

sub myfunc { print "This is a test\n" }

sub invoke {
    my $sub = shift;
    my $stdout;
    {
        local *STDOUT;
        open STDOUT,'>',\$stdout
            or die "Cannot open STDOUT to a scalar: $!";
        $sub->(@_);
        close STDOUT
            or die "Cannot close redirected STDOUT: $!";
    }
    return $stdout;
}

chomp(my $ret =  invoke(\&myfunc));

ok($ret eq "This is a test","myfunc() prints test string" );
diag("myfunc() printed '$ret'");

输出

C:\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'

对于版本早于5.8的perl,你可能需要使用IO::Scalar,但我不知道如何在5.8之前工作。

猜你在找的Perl相关文章