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 test app 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);
Note also that the content is returned as raw bytes, without any attempt to decode it into characters.
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'});
Alternately, you can pass in an HTTP::Request::Common object to set arbitrary request headers.
my $res = request(GET '/foo/bar',
X-Foo => 'Bar',
Authorization => 'Bearer JWT_HERE',
...
);
Works exactly like request, except it also returns the Catalyst context object, $c
. Note that this only works for local requests.
Fetches the given URL and checks that the request was successful. An optional second argument can be given to specify the name of the test.
Fetches the given URL and checks that the request was a redirect. An optional second argument can be given to specify the name of the test.
Fetches the given URL and checks that the request was not found. An optional second argument can be given to specify the name of the test.
Fetches the given URL and returns whether the content matches the regexp. An optional third argument can be given to specify the name of the test.
Verify the given URL has a content type of $type and optionally specify a test name.
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.