2016-11-19 14 views
1

Я пишу тестовые примеры для веб-приложения на основе Perl Catalyst с тестом :: WWW :: Механизмом :: Catalyst. Я где-то застрял, и я хочу устранить проблему, напечатав значение переменной/хэша. Но проблема в том, что он просто показывает консольный журнал приложения Catalyst. Как напечатать значение переменной в консоли? как в катализаторе $ c-> log-> info (значение переменной $).Невозможно распечатать переменную/хэш в тестовом примере с помощью теста :: WWW :: Механизм :: Катализатор в приложении для катализатора perl

ответ

1

При выполнении ваших тестов с помощью prove вам необходимо добавить флаг -v, чтобы увидеть весь тестовый результат.

$ prove -v t/ 

Таким образом, он не будет потреблять весь выход TAP.

Вы можете использовать diag from Test::More для вывода комментариев в TAP, или the warn builtin.

use Test::More; 

pass 'first test'; 
diag 'this is a diagnostical message'; 

my $res = pass 'another test'; 
warn $res; 

done_testing; 

Это производит этот выход (на Windows):

$ prove -v foo.pl 
foo.pl .. # this is a diagnostical message 

1 at foo.pl line 7. 
ok 1 - first test 
ok 2 - another test 
1..2 
ok 
All tests successful. 
Files=1, Tests=2, 0 wallclock secs (0.02 usr + 0.02 sys = 0.03 CPU) 
Result: PASS 

Однако то, что я обычно делаю это, чтобы использовать Data::Printerp функцию «s, который также записывает STDERR как предупреждение. Это немного более мощный, чем Data: Dumper и хорошо отображает объекты. Отладочный вывод от p также просто окажется где-то в TAP.

Может возникнуть путаница, если из приложения будет много регистрации, поэтому отключить журнал Catalyst можно. Для этого запустите ваши тесты с переменной окружения CATALYST_DEBUG, установленной на 0.

$ CATALYST_DEBUG=0 prove -v t/ 

Если вместо этого вы хотите, чтобы ваш выход отладки из теста перейти в журнал Catalyst, вы должны захватить контекст. Это немного сложнее, но возможно.

use Test::More 
use Test::WWW::Mechanize::Catalyst; 
use Catalyst::Test 'MyApp'; 
use Data::Printer; 

my $mech = Test::WWW::Mechanize::Catalyst->new(catalyst_app => 'MyApp'); 

$mech->get_ok("/"); 

my($res, $c) = ctx_request('/'); 
$c->log->warn(np $res); # this will go to the Catalyst log 

Этот код использует как Test::WWW::Mechanize::Catalyst и Catalyst::Test. Если вы передадите одно и то же имя приложения, они не попадут друг в друга, и приложение будет запущено только один раз.

Я показываю обычный мех-тест с get_ok и функцией ctx_request от Catalyst :: Test. Он возвращает объект HTTP :: Response и контекст $c из этого запроса. Вы можете запустить в контексте, и ваша отладка перейдет в журнал Catalyst. Я использую np из Data :: Printer, который возвращает информацию об отладке, сгенерированную Data :: Printer, вместо того, чтобы записывать ее в STDOUT, поэтому я могу поместить ее в журнал Catalyst.

+0

У меня нет доступа к Catalyst прямо сейчас. Я пересмотрю это, как только я это сделаю. – simbabque

+0

ты мой симбабль, -в сделал волшебство. Еще раз спасибо –

+0

simbabque, еще раз спасибо за обмен хорошей информацией. –