无法在 Perl Catalyst 应用程序中使用 Test::WWW::Mechanize::Catalyst 在测试用例中打印 variable/hash
Not able to print a variable/hash in a test case with Test::WWW::Mechanize::Catalyst in perl catalyst app
我正在使用 Test::WWW::Mechanize::Catalyst 为基于 Perl Catalyst 的 Web 应用程序编写测试用例。我卡在某个地方,我想通过打印 variable/hash 值来排除故障。但问题是它只显示 Catalyst App 的控制台日志。如何在控制台中打印变量值?就像在催化剂 $c->log->info($variable value) 中一样。
当您 运行 使用 prove
进行测试时,您需要添加 -v
标志以查看所有测试输出。
$ prove -v t/
这样它就不会耗尽所有 TAP 输出。
然后您可以使用 diag
from Test::More to output comments into the TAP, or 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::Printer的p
函数,它也像警告一样写入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 and Catalyst::Test。如果您传递相同的应用程序名称,它们将不会互相干扰,并且该应用程序只会启动一次。
我正在使用 get_ok
和 Catalyst::Test 中的 ctx_request
函数展示常规机械测试。它 returns 一个 HTTP::Response 对象和该请求的上下文 $c
。您可以在上下文中 运行 ->log
,您的调试将进入 Catalyst 日志。我正在使用 Data::Printer 中的 np
,其中 returns 由 Data::Printer 生成的调试信息,而不是将其写入 STDOUT,以便我可以将其放入 Catalyst 日志中。
我正在使用 Test::WWW::Mechanize::Catalyst 为基于 Perl Catalyst 的 Web 应用程序编写测试用例。我卡在某个地方,我想通过打印 variable/hash 值来排除故障。但问题是它只显示 Catalyst App 的控制台日志。如何在控制台中打印变量值?就像在催化剂 $c->log->info($variable value) 中一样。
当您 运行 使用 prove
进行测试时,您需要添加 -v
标志以查看所有测试输出。
$ prove -v t/
这样它就不会耗尽所有 TAP 输出。
然后您可以使用 diag
from Test::More to output comments into the TAP, or 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::Printer的p
函数,它也像警告一样写入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 and Catalyst::Test。如果您传递相同的应用程序名称,它们将不会互相干扰,并且该应用程序只会启动一次。
我正在使用 get_ok
和 Catalyst::Test 中的 ctx_request
函数展示常规机械测试。它 returns 一个 HTTP::Response 对象和该请求的上下文 $c
。您可以在上下文中 运行 ->log
,您的调试将进入 Catalyst 日志。我正在使用 Data::Printer 中的 np
,其中 returns 由 Data::Printer 生成的调试信息,而不是将其写入 STDOUT,以便我可以将其放入 Catalyst 日志中。