Mojoを使って自作ウェブアプリをよりポータブルに!

第2回 Mojoを使えばテストも簡単!

この記事を読むのに必要な時間:およそ 4 分

テストは正常に見えるバグも見つけてくれます

これでブラウザからは直ったように見えますが,ふたたびテストを実行してみると,まだミスが見つかります。

Running tests from '/home/ishigaki/mojo/simple_bbs/t'.
t/basic..........ok
t/false_value....1/1
#   Failed test at t/false_value.t line 12.
#                   '<html><head><title>Simple BBS</title></head><body>
# <form method="POST"><input type="text" name="text"></form>
# <p>0
# </p>
# </body></html>
# '
#     doesn't match '(?-xism:<p>0</p>)'
# Looks like you failed 1 test of 1.
t/false_value.... Dubious, test returned 1 (wstat 256, 0x100)
 Failed 1/1 subtests

改行が落ちていなかったのですね。

@@ -19,7 +19,7 @@
         close $fh;
     }
     open my $fh, '<', $file or die $!;
-    my @lines = <$fh>;
+    my @lines = map { chomp; $_ } <$fh>;
     close $fh;

     $tx->res->code(200);

これでひとまずt/false_value.tのテストは通るようになりました。めでたしめでたしと言いたいところですが,このテストデータはいったいどこに保存されていたのでしょうか?

設定は外から変更できるように

テストを実行したときに,前のテストデータが残っていては正しいテストにはなりません。データファイルの設定は外から変更できたほうがよいでしょう。

このような場合,アプリケーションのコンストラクタに環境依存の設定を渡せるようにするのが常道ですが,ここではあとからデータファイルを操作することが予想されますので,アクセサ/ミューテータを用意することにします。

lib/SimpleBBS.pmの差分はこのようになります。

@@ -5,10 +5,12 @@

 use base 'Mojo';

+__PACKAGE__->attr(datafile => 'data.txt');
+
 sub handler {
     my ($self, $tx) = @_;

-    my $file = 'data.txt';
+    my $file = $self->datafile;
     unless (-f $file) {
         open my $fh, '>', $file or die $!;
         close $fh;

t/false_value.tの方も修正しましょう。

@@ -6,8 +6,10 @@

 my $app = SimpleBBS->new;
 {
+    $app->datafile('test_false_value.txt');
     my $tx = Mojo::Transaction::Single->new;
     $tx->req->param('text' => 0);
     $app->handler($tx);
     like $tx->res->body => qr{<p>0</p>};
+    unlink $app->datafile;
 }

これで何度テストを実行しても,古いデータでテストしたり本番環境のデータを壊したりすることはなくなりました。

同じ要領でt/xss.tを書いて,XSS(クロスサイトスクリプティング)のバグもつぶしておいてください。

Mojoを使うと,アプリケーションが自然にサーバ環境に依存する部分とそうでない部分に分かれていきます。アプリケーションと各種サーバを結びつける部分はMojoのほうでテスト済みですから,わさわざ自分でテストする必要はありません。どのような環境でも変わらない,アプリケーション本体だけをテストすればよい――そのような責任の分担が、Mojoを使う大きなメリットのひとつです。

次回は画面遷移のあるもう少し複雑なアプリケーションに挑戦してみます。お楽しみに。

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/