I really like the flexibility of
Plack::Test, as testing an app
in process or against a backend is trivial. I understand the callback
interface—it definitely feels PSGIish, and it fits the interface that Test::TCP prefers. Yet
there's always room to experiment.
Plack::Test::Agent offers the ability to run tests in process
or over HTTP against a server. It relies on
Test::TCP and Plack::Loader for the
hard work, and borrows liberally from
Plack::Test. Yet in doing
so, it offers an OO interface:
my $agent = Plack::Test::Agent->new( app => $app ); my $res = $agent->get( '/?have=foo;want=foo' ); ok $res->is_success, 'Request should succeed when values match'; is $res->decoded_content, 'ok', '... with descriptive success message';
server key/value pair, and it'll do its best to find and
launch the appropriate server. All of your tests should continue to pass,
modulo bugs in your assumptions or the handler/server interface.
Just for kicks, I added an experimental feature:
my $mech = Plack::Test::Agent->new( app => $app, server => 'HTTP::Server::PSGI' )->get_mech; $mech->get_ok( '/?have=foo;want=foo', 'Request should succeed when values match' ); $mech->content_is( 'ok', '... with descriptive success message' );
... which returns a Test::WWW::Mechanize object bound to the started server such that relative URI requests go directly to the server. (Absolute URI requests remain unchanged.) The next obvious step is to return a Test::WWW::Mechanize::PSGI object for in process testing. That's the work of a few moments.
Perhaps that goes too far, but I do like how it's simplified my test code so far.