gpt4 book ai didi

perl - 如何对打印到屏幕的 Perl 函数进行单元测试?

转载 作者:行者123 更新时间:2023-11-28 19:38:49 31 4
gpt4 key购买 nike

我正在尝试使用 Test::More对打印到屏幕的 Perl 函数进行单元测试。

我知道此输出可能会干扰 prove 等工具.

我如何捕获此输出,以便我可以使用 diag() 打印它,并对输出本身运行测试?

最佳答案

更新: 恕我直言,这个问题的正确答案应该是使用 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> tm1..1ok 1 - myfunc() returns test output

I am leaving the original answer for reference as, I believe, it still illustrates a useful technique.

You can localize STDOUT and reopen to a scalar before calling the function, restore afterward:

#!/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> tm1..1ok 1 - myfunc() prints test string# myfunc() printed 'This is a test'

对于低于 5.8 的 perl 版本,您可能需要使用 IO::Scalar ,但我不太了解 5.8 之前的工作原理。

关于perl - 如何对打印到屏幕的 Perl 函数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1538260/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com