尝试创建一个带有模板值的字符串,并对模板是否正确处理进行单元测试

Trying to create a string with template values and unit test that the template is processing correctly

我正在尝试创建一个测试文件,使用模板工具包将模板值输入到字符串中,但我不知道要包含什么 check/tests 以确保模板工具包正确处理字符串。这是我的代码:

#!/usr/bin/env perl

use lib ('./t/lib/');

use strict;
use warnings;

use Template;

use Test::More tests => 1;



# options/configuration for template
 my $config = {
     #PRE_PROCESS => 1, # means the templates processed can use the same global vars defined earlier
     #INTERPOLATE => 1,
     #EVAL_PERL => 1,
     RELATIVE => 1,
     OUTPUT_PATH => './out',

 };

my $template = Template->new($config);

# input string
my $text = "This is string number [%num%] ."; 

# template placeholder variables
my $vars = {
     num => "one",
 };


# processes imput string and inserts placeholder values 
my $create_temp = $template->process($text, $vars)
    || die "Template process failed: ", $template->error(), "\n";


#is(($template->process($text, $vars)), '1' , 'The template is processing correctly');

# If process method is executed successfully it should have a return value of 1
diag($template->process($text, $vars));

diag 函数 returns 值为 1,从文档中可以看出该字符串已成功处理,但我一直在尝试检查标准输出是什么,以便我可以看到输出字符串,但我可以打印出来。我尝试将标准输出从终端命令写入文件,但文件中没有任何内容。不过,我可以将 stderr 写入文件。 我也一直在为模板尝试不同的配置,如下面的代码所示。它不起作用是因为我没有 运行 任何测试,还是我以错误的方式使用了模板工具包?

如果需要任何其他信息来回答这个问题,请在下面评论。

这个答案假定 $template->process 语句确实在您的生产代码中,而不是在单元测试中,并且展示了如果您不能只告诉它将输出重定向到一个变量中时该怎么做, .

您可以使用Test::Output检查STDOUT

use Test::Output;

stdout_is { $template->process( $text, $vars ) } q{This is string number one .},
    q{Template generates the correct output};

备选方案可以是 Capture::Tiny 和两步测试。

use Capture::Tiny 'capture_stdout';

my $output = capture_stdout {
    ok $template->process( $text, $vars ), q{Template processes successfully};
};
is $output, q{This is string number one .}, q{... and the output is correct};

请注意,这两种解决方案都会吃掉输出,因此它也不会干扰您的终端(它不会干扰 TAP,因为 Test::Harness 只查看 STDOUT)。

这里的主要问题是 process() 将其输出发送到 STDOUT 而您没有捕获它。所以你在那里看不到扩展输出。

process() 方法采用可选的第三个参数,它可以采用各种有用的值。您可能想向它传递一个对空标量变量的引用,然后用扩展模板填充它。

$template->process($text, $vars, $output);
is($output, $expected_output);

但值得注意的是,TT 发行版包括 Template::Test,您可能会发现它非常有用。