Catalyst::Test
Catalyst::Testでは、Catalystアプリケーションに対するリクエストを行い、そのレスポンスを用いてさまざまなテストを行うメソッドが用意されています。
Catalyst::Testは、デフォルトではサーバを起動することなく、アプリケーションの動作をシミュレートしたリクエスト-レスポンスに対してテストを行いますが、環境変数「CATALYST_SERVER」を使用することでリモートサーバに対するテストを行うこともできます。リモートサーバに対してテストを行う場合には、次のように指定します。
$ CATALYST_SERVER=http://192.168.123.57:3000 prove --lib t
Catalyst::Testに定義されているメソッド/関数には次のものがあります。
request
requestメソッドと後述するgetメソッドでは、リクエスト先に関する情報を引数として渡してやると、対象となる接続先に対してリクエストを行い、レスポンスを受け取ります。
引数には、文字列形式のURLやURIオブジェクト、そしてHTTP::Requestオブジェクトを渡すことができます。また、オプションとしてリクエスト時に使用するヘッダ情報をハッシュ参照として指定することもできますが、現在使用できる値はhostのみです。
requestメソッドでは、リクエストの結果としてHTTP::Responseのオブジェクトを返します。
# URLを文字列として指定
my $res = request('/user?name=John');
$res = request('http://example.com/user?name=John');
# hostヘッダを指定
$res = request('/user?name=John', { host => 'example.com' });
# URIオブジェクト
$res = request(URI->new('http://example.com/user?name=John'));
# HTTP::Requestオブジェクト
$res = request(HTTP::Request->new(GET => 'http://example.com/user?name=John'));
HTTP::Responseオブジェクトを使用することで、コンテンツ以外にも、リダイレクトの判定やHTTPヘッダのテストなど、より詳しい条件を記述できます。requestメソッドは単独ではテストを記述することができないので、他のテストメソッドと合わせて使用します。
requestメソッドを使用したテストは次のように記述します。
# ステータスが2XXの場合
ok( request('/')->is_success, 'Request should succeed' );
# ステータスが4XX、5XXの場合
ok( request('/notfound')->is_error, 'Not found page' );
# リクエスト先がリダイレクトする場合(ステータスが3XX)
ok( request('/jump')->is_redirect, 'Redirect page' );
# HTTP::Request::CommonのPOSTメソッドを使用してパラメータを送信
use HTTP::Request::Common;
my $response = request( POST '/register', [
name => 'john',
age => 32
]);
# responseのコンテンツから正規表現で登録した値をテスト
my $content = $response->content;
like ($content, qr/john/, 'Check registered name');
like ($content, qr/32/, 'Check registered age');
requestメソッドでは、デフォルトの呼び出し方をした場合にはHTTPのGETメソッドで送信されてしまいます。HTTPのPOSTメソッドを使用するには、上記の後半で記述しているように、HTTP::Request::Commonを使用します。
この例では、HTTP::Request::Commonに定義されているPOST関数を用いてHTTP::Requestオブジェクトを作成し、requestメソッドに渡しています。そしてそのレスポンスに含まれる登録情報を、likeメソッドを使用して正規表現でチェックしています。
HTTP::Request::Commonには、HTTPのメソッド名に対応する次のような関数が定義されています。
| 関数名 | 引数仕様 |
| GET | $url |
| GET | $url, Header => Value,... |
| HEAD | $url |
| HEAD | $url, Header => Value,... |
| PUT | $url |
| PUT | $url, Header => Value,... |
| PUT | $url, Header => Value,..., Content => $content |
| DELETE | $url |
| DELETE | $url, Header => Value,... |
| POST | $url |
| POST | $url, Header => Value,... |
| POST | $url, $form_ref, Header => Value,... |
| POST | $url, Header => Value,..., Content -> $form_ref |
| POST | $url, Header => Value,..., Content -> $content |
例えば、User-Agentによりビューを切り替えるようなアプリケーションの場合、次のようにUser-Agentを指定することで、テストを実行できます。
use HTTP::Request::Common; ok(request( GET '/', User_Agent => 'DoCoMo/2.0')->is_success, 'DoCoMo test');
get
getは、内部的にはrequestメソッドを呼び出しているので、引数については同じものを指定できます。requestメソッドとの違いは、戻り値がHTTP::Responseオブジェクトではなく、コンテンツ文字列になります。
getメソッドも単独ではテストを記述することができないため、okなどのメソッドと合わせて使用します。
次の例では、存在しないURLに対してリクエストを行い、戻ってきたコンテンツが'Page not found'と一致するかどうかをテストしています。
my $content = get('/notfound');
ok($content eq 'Page not found', 'not found page');
その他の関数
上記で紹介したもの以外にも、次のような関数が用意されています。詳細はCatalyst::Testを参照ください。
| 関数名 | 説明 |
| ctx_request | requestとほぼ同じであるが、Catalystのコンテキストオブジェクトも返す |
| action_ok | レスポンスのステータスコードが2xxの場合に真となる |
| action_redirect | レスポンスのステータスコードが3xxの場合に真となる |
| action_notfound | レスポンスのステータスコードが404の場合に真となる |
| content_like | レスポンスのコンテンツが指定した正規表現にマッチする場合に真となる |
| contenttype_is | レスポンスのContent-Typeをチェックする |
