Dumper the lexical variables after failed test case(Just Idea)
Hi,
I got an another hacking idea for perl testing.
Hook the Test::Builder::ok using PadWalker. Dump the lexical vars in testing context.
package Test::Power {
no warnings 'redefine';
use Test::Builder ();
use PadWalker ();
use Data::Dump::Streamer;
use Data::Dumper;
my $orig_ok = \&Test::Builder::ok;
*Test::Builder::ok = sub {
# my ($self, $test, $msg) = @_;
{
local $Test::Builder::Level = $Test::Builder::Level + 1;
$orig_ok->(@_);
}
unless ($_[1]) {
my ($pkg, $filename, $lineno) = caller($Test::Builder::Level);
if (defined $pkg) {
my $lexicals = PadWalker::peek_my($Test::Builder::Level+1);
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 1;
local $Data::Dumper::Maxdepth = 3;
$_[0]->diag(Dumper($lexicals));
} else {
# users testing env is broken.
}
}
};
}
Example testee code.
package Square {
use Moose;
has x => (is => 'rw');
has y => (is => 'rw');
sub area {
my ($self) = @_;
return $self->x * $self->y;
}
}
Example test code
package main {
use Test::More;
my $sq = Square->new(x => 4, y => 5);
is($sq->area, 24);
done_testing;
}
Then, you get a dumped lexical vars automatically. It may be useful for debugging(I hope).
not ok 1
# Failed test at hoge.pl line 51.
# {
# '$sq' => \bless( {
# 'y' => 5,
# 'x' => 4
# }, 'Square' )
# }
# got: '20'
# expected: '24'
1..1
# Looks like you failed 1 test of 1.
It's just idea. What do you think?
Thanks.
Published: 2012-10-23(Tue) 22:14