2016-04-15 67 views
4

我想創建一個測試文件,輸入模板值到一個字符串使用模板工具包,但我不知道什麼檢查/測試包括確保模板工具包正確處理字符串。這裏是我的代碼:試圖創建一個字符串與模板值和單元測試,模板正在處理

#!/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)); 

的診斷函數返回值爲1,從文件意味着字符串已經被成功地處理過,但我一直在努力檢查stdout是這樣我就可以看到輸出什麼字符串,但我可以打印它。我已經嘗試從終端命令將stdout寫入文件,但文件中沒有顯示任何內容。儘管我可以將stderr寫入文件。 我也一直在嘗試模板的不同配置,如下面的代碼所示。它不工作,因爲我沒有運行任何測試,或者我以錯誤的方式使用模板工具包?

如果還有其他必需的信息需要回答這個問題,請在下面評論。

+1

你正在描述的問題有點過於複雜,我認爲。雖然提供背景很好,但真正的問題會丟失。我想你在問如何檢查Template是否創建了正確的輸出,所以這就是我的回答。基本上你想測試你的模板是否工作? – simbabque

+1

是的。哈哈。抱歉。我試圖詳細說明 –

回答

4

這個答案假設$template->process聲明確實在你的產品代碼中,而不是在單元測試中,並且顯示瞭如果你不能告訴它將輸出重定向到一個變量like Dave shows in his answer中該怎麼做。您可以使用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,作爲供試品::線束只看STDOUT)。

4

您的主要問題在於,process()將其輸出發送到STDOUT,而您沒有捕獲它。所以你沒有看到擴大的輸出。

process()方法採用可選的第三個參數,它可以採取各種有用的值。您可能希望將它傳遞給一個空標量變量,然後用擴展後的模板填充該變量。

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

但值得注意的是,TT分佈包括Template::Test,你可能會發現非常有用的。

+0

我不知道Template :: Test。很有用。 :) – simbabque

+0

我忘記了它。但我確信像**這樣的東西必須存在:-) –

+0

現在我正在考慮如何在$ work中使用它以獲得更多類型的前端覆蓋。好極了。 :)還加了一個免責聲明給我的答案,使它與你有些不同。 – simbabque