
Catalyst::Test - Test Catalyst Applications

# Helper
script/test.pl
# Tests
use Catalyst::Test 'TestApp';
my $content = get('index.html'); # Content as string
my $response = request('index.html'); # HTTP::Response object
my($res, $c) = ctx_request('index.html'); # HTTP::Response & context object
use HTTP::Request::Common;
my $response = request POST '/foo', [
bar => 'baz',
something => 'else'
];
# Run tests against a remote server
CATALYST_SERVER='http://localhost:3000/' prove -r -l lib/ t/
use Catalyst::Test 'TestApp';
use Test::More tests => 1;
ok( get('/foo') =~ /bar/ );
# mock virtual hosts
use Catalyst::Test 'MyApp', { default_host => 'myapp.com' };
like( get('/whichhost'), qr/served by myapp.com/ );
like( get( '/whichhost', { host => 'yourapp.com' } ), qr/served by yourapp.com/ );
{
local $Catalyst::Test::default_host = 'otherapp.com';
like( get('/whichhost'), qr/served by otherapp.com/ );
}

This module allows you to make requests to a Catalyst application either without a server, by simulating the environment of an HTTP request using HTTP::Request::AsCGI or remotely if you define the CATALYST_SERVER environment variable. This module also adds a few Catalyst-specific testing methods as displayed in the method section.
The get and request functions take either a URI or an HTTP::Request object.

While it used to be possible to inline a whole testapp into a .t file for a distribution, this will no longer work.
The convention is to place your Catalyst test apps into t/lib in your distribution. E.g.: t/lib/TestApp.pm, t/lib/TestApp/Controller/Root.pm, etc.. Multiple test apps can be used in this way.
Then write your .t files like so:
use strict;
use warnings;
use FindBin '$Bin';
use lib "$Bin/lib";
use Test::More tests => 6;
use Catalyst::Test 'TestApp';

Returns the content.
my $content = get('foo/bar?test=1');
Note that this method doesn't follow redirects, so to test for a correctly redirecting page you'll need to use a combination of this method and the request method below:
my $res = request('/'); # redirects to /y
warn $res->header('location');
use URI;
my $uri = URI->new($res->header('location'));
is ( $uri->path , '/y');
my $content = get($uri->path);
Returns an HTTP::Response object. Accepts an optional hashref for request header configuration; currently only supports setting 'host' value.
my $res = request('foo/bar?test=1');
my $virtual_res = request('foo/bar?test=1', {host => 'virtualhost.com'});

Works exactly like request, except it also returns the Catalyst context object, $c. Note that this only works for local requests.
Simulate a request using HTTP::Request::AsCGI.
Do an actual remote request using LWP.
Fetches the given URL and checks that the request was successful.
Fetches the given URL and checks that the request was a redirect.
Fetches the given URL and checks that the request was not found.
Fetches the given URL and returns whether the content matches the regexp.
Check for given MIME type.

Catalyst, Test::WWW::Mechanize::Catalyst, Test::WWW::Selenium::Catalyst, Test::More, HTTP::Request::Common

Catalyst Contributors, see Catalyst.pm

This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.