NAME
Test::Routine::AutoClear - Enables autoclearing attrs in Test::Routines
VERSION
version 0.004
SYNOPSIS
use Test::Routine::AutoClear;
use Test::More;
use File::Tempdir;
has _tempdir => (
is => 'ro',
isa => 'Int',
builder => '_build_tempdir',
lazy => 1,
autoclear => 1,
handles => {
tempdir => 'name',
},
);
sub _build_tempdir {
File::Tempdir->new();
}
And now all the tests that use a tempdir in your test routine will get a fresh Tempdir
DESCRIPTION
When I'm writing tests with Test::Routine I find myself writing code like this all the time:
has counter => (
is => ro,
lazy => 1,
default => 0
lazy => 1,
clearer => 'reset_counter',
);
after run_test => sub {
shift->reset_counter;
};
And after about the first time, I got bored of doing this. So I started to fix it, and here's my first cut.
Test::Routine::AutoClear addresses this by adding a new autoclear
key to the has
arguments. If you set autoclear
to a true value on an attribute then, after each test is run, all the autoclearing attributes will be reset.
Clearing logic
Consider the following Test::Routine:
use Test::More;
use Test::Routine::AutoClear;
use Test::Routine::Util;
has some_attrib => (
is => 'ro',
default => 10,
lazy => 1,
autoclear => 1,
clearer => 'reset_attrib',
);
test "This should be invariant" => sub {
my $self = shift;
my $attrib = $self->attrib;
$self->reset_attrib;
is $self->attrib, $attrib;
};
run_me "Test defaults";
run_me "Test initialising", { attrib => 20 };
done_testing;
It seems to me that, in a perfect world at least, that test should pass. Which it does. Huzzah!
Passing a builder
So... you're writing a Moose object and you want the default value to be an empty arrayref. You'll have noticed that you can't write:
has queue => (
is => 'ro',
default => [],
);
Moose will complain vigorously. And rightly so. If you were to do:
run_me "Something", { queue => [qw(something)] }
you would rapidly discover E<why> Moose complains. So what's a poor tester to do?
Why, take advantage of the very lovely and worthwhile builder
helper and write this:
run_me "This works", { queue => builder { [] } };
and Test::Routine::AutoClear will pretend that you _actually_ declared queue like so:
has queue => (
is => 'ro',
default => sub { [] },
);
NB: The builder routine you passed in is called just like a Moose builder method, so you get to look at the instance you're building the value for. However, right now, this builder is _not_ called lazily, so there's no guarantee that attributes that you may depend on have been intialized yet. Expect this to be fixed in a future version.
BUGS
Lots. Including, but not limited to:
The interface is still very fluid. I make no promises about interface stability.
I'm pretty sure that if you end up mixing in multiple roles that use this role then you'll end up clearing your attributes lots of times.
SEE ALSO
AUTHOR
Piers Cawley <pdcawley@bofh.org.uk>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Piers Cawley.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 152:
Unknown E content in E<why>