8. Mojolicious の テ ン プ レ ー ト に な じ め な い 方 は 、 MojoX::Renderer::TT や
MojoX::Renderer::Xslate といった代替品もありますが、なかには最新版に対応していない
ものもあるかもしれません(TT の最新版は Windows だとテストに失敗するようです)。
ディスパッチャのテストを書く
ディスパッチャを書いたら、期待通りの動作をしているか、テストしてみましょう。先ほ
どのようにサーバを起動してブラウザで確認してもかまいませんが、Mojolicious に同梱さ
れている Test::Mojo を使うとあたかも人間が実際にアクセスしたかのようなテストコード
を書くこともできます。試しに myapp.pl と同じディレクトリに test.t というテストスクリ
プトを用意してみましょう。
use strict;
use warnings;
use Test::More;
use Test::Mojo;
require 'myapp.pl';
my $t = Test::Mojo->new;
$t->get_ok('/html/foobar')->status_is(200);
done_testing;
ここではまだステータスコードの確認しかしていませんが、Mojo::DOM の機能を使うと
CSS セレクタを利用して HTML の中身を細かく調べることもできます。詳しくは
Test::Mojo と Mojo::DOM をそれぞれ確認してみてください。
モデルをつくる
モデリングの仕方にもさまざまな流儀がありますが、ここではあまり細かなことは考えず、
モデルの適切なメソッドに「/foo/bar」のようなパス情報(と、必要に応じて更新用のデー
タ)を渡したら、該当するファイルの内容を取り出したり、更新したりできるようになっ
ていればよしとしましょう。
9. また、テストのしやすさを考えて、表示?更新に使うファイルを格納するディレクトリは
オブジェクト作成時に変更できるようにしておくのが無難です。
本当に小さなアプリケーションで、モデルクラスもそれほど大きくならないことがわかっ
ている場合は、myapp.pl スクリプトと同じディレクトリに MyApp.pm のようなモジュー
ルを用意してもかまいませんが、ここではいずれほかのモジュールも追加することになる
ことが予想できますので、CPAN モジュールで一般的に使われているレイアウトにあわせ
ることにしましょう。lib ディレクトリを掘って、lib/MyApp.pm というファイルを用意し
ます。
package MyApp;
use strict;
use warnings;
use File::Spec;
sub new {
my $class = shift;
bless {@_}, $class;
}
sub home { shift->{home} || '.' }
sub read {
my ($self, $path) = @_;
my $file = File::Spec->catfile($self->home, $path);
open my $fh, '<', $file or die $!;
local $/;
return <$fh>;
}
sub create {
my ($self, $path, $content) = @_;
my $file = File::Spec->catfile($self->home, $path);
open my $fh, '>', $file or die $!;
print $fh $content;
}
1;
10. モデルをテストする
モデルが書けたらテストもしましょう。CPAN のレイアウトにあわせてテストファイルは t
ディレクトリ以下に置くことにします。t/model.t というスクリプトを用意してください。
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use MyApp;
use Test::More;
my $testdir = "$FindBin::Bin/test";
mkdir $testdir unless -d $testdir;
my $m = MyApp->new(home => $testdir);
$m->create('foo', 'foobar');
is $m->read('foo') => 'foobar';
done_testing;
Mojolicious::Lite アプリにモデルを組み込む
最後に Mojolicious::Lite アプリからモデルを呼び出せるようにしましょう。
まずは myapp.pl の先頭の方にこのようなコードを追加します。
use lib 'lib';
use MyApp;
my $model = MyApp->new(home => app->home);
app->helper(model => sub {return $model});