2016-11-19 65 views
1

我寫測試用例與測試:: WWW Perl的催化劑基於Web的應用程序來打印可變/散在測試用例的Test :: WWW ::機械化::催化劑::機械化::催化劑。我卡在某個地方,我想通過打印變量/散列值來排除故障。但問題是它只顯示Catalyst App的控制檯日誌。如何在控制檯中打印變量值?如催化劑$ c-> log-> info($ variable value)。不能在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功能,這也寫入STDERR像一​​個警告。它比Data :: Dumper更強大,並且很好地顯示對象。 p的調試輸出也將在TAP中的某處結束。

如果應用程序正在進行大量日誌記錄,可能會引起混淆,因此關閉Catalyst日誌是一個選項。爲此,請使用設置爲0的環境變量CATALYST_DEBUG運行測試。

$ CATALYST_DEBUG=0 prove -v t/ 

相反,如果你希望你的調試輸出從測試進入催化劑日誌,你需要抓住的上下文。這有點棘手,但可能。

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::CatalystCatalyst::Test。如果你傳遞相同的應用程序名稱,他們將無法進入彼此的方式,該應用程序將只啓動一次。

我展示與get_ok一個普通機甲的測試和催化劑的ctx_request功能::測試。它返回一個HTTP :: Response對象和來自該請求的上下文$c。您可以在上下文中運行->log,並且您的調試將轉到Catalyst日誌。我使用Data :: Printer中的np,它返回由Data :: Printer生成的調試信息,而不是將其寫入STDOUT,因此我可以將它放入Catalyst日誌中。

+0

我現在無法訪問Catalyst。我會一旦修改就修改。 – simbabque

+0

你是我的冠軍simbabque,-v做到了魔術。再次感謝 –

+0

simbabque,再次感謝您分享這麼好的信息。 –