2016-04-15 7 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 в файл из команды терминала, но ничего не появляется в файле. Однако я могу написать stderr в файл. Я также пробовал различную конфигурацию для шаблона, как показано в приведенном ниже коде. Разве это не работает, потому что я не выполняю никаких тестов, или я использую Template Toolkit не так?

Если у вас есть какая-либо другая информация, необходимая для ответа на этот вопрос, просто комментарий ниже.

+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, как Test :: Harness смотрит только на STDOUT).

4

Ваша основная проблема заключается в том, что process() отправляет свой вывод в STDOUT, и вы не захватываете его. Таким образом, вы не видите расширенный вывод anythere.

Метод process() принимает необязательный третий аргумент, который может принимать всевозможные полезные значения. Вы, вероятно, захотите передать ему ссылку на пустую скалярную переменную, которая затем заполняется расширенным шаблоном.

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

Но стоит отметить, что распределение TT включает в себя Template::Test, который вы, вероятно, найти очень полезно.

+0

Мне не было известно о шаблоне :: Test. Очень полезно. :) – simbabque

+0

И я забыл об этом. Но я был уверен, что что-то вроде этого ** должно существовать :-) –

+0

Теперь я думаю, как мы можем использовать его в $ work, чтобы получить больше возможностей для внешнего покрытия. Ура. :) Также добавлен отказ от моего ответа, чтобы он немного отличался от вашего. – simbabque