読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

MVCその6

続き。
はてブのタグを検索キーワードにして、新着記事を一覧にして表示するプログラムをCatalystで作る。
最初に参考サイト「404 Not Found」。

準備

あらかじめ、CPANから以下のものを入れておく。

スケルトン

じゃあまずはスケルトンを作る。

$ catalyst.pl MyHatena::Web
created "MyHatena-Web"
(略)
$ ls
MyHatena-Web
$ ls MyHatena-Web
Changes			lib			script
Makefile.PL		myhatena_web.conf	t
README			root
test

いきなりtest!!!

$ cd MyHatena-Web
$ prove -lvr t
t/01app.t .......... [debug] Debug messages enabled
(debug情報)
[info] MyHatena::Web powered by Catalyst 5.8002
ok 1 - use Catalyst::Test;
(debug情報)
ok 2 - Request should succeed
1..2
ok
t/02pod.t .......... 
1..0 # SKIP set TEST_POD to enable this test
skipped: set TEST_POD to enable this test
t/03podcoverage.t .. 
1..0 # SKIP Test::Pod::Coverage 1.04 required
skipped: Test::Pod::Coverage 1.04 required
All tests successful.
Files=3, Tests=2,  1 wallclock secs ( 0.04 usr  0.02 sys +  1.26 cusr  0.08 csys =  1.40 CPU)
Result: PASS

通った!! ってこれで失敗したらどうしようかと思った。
あとついでにTest::Pod::Coverageがあれば良さそうなので後で入れておく。

ヘルパーを使おう

スケルトンはできた。
ではまずは……、どうするのが定石なんだろう?
とりあえず、必要なControllerとテンプレートを押さえておくのが先か?

Controller

えっとControllerで必要なのは、

  • Index.pm
  • Search.pm

の二つだけど、でも考えてみれば、Index.pmってデフォルトのRoot.pm内で定義しちゃうのが正しい気がする…。
だってindexだし……。
じゃあSearch.pmだけでいっか。

$ script/myhatena_web_create.pl Controller Search
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/Controller"
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/Controller/Search.pm"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t/controller_Search.t"
View

テンプレートは別に自分で作るとして、それを表示するためのクラスがいる。
デフォルトはTemplate-Toolkitだし、今まで使ってたこともあってちょっと安心。

$ script/myhatena_web_create.pl View TT TT
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/View"
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/View/TT.pm"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t/view_TT.t"

おまじないのように使ってるけど、最後の「TT TT」って、最初に挙げた参考サイトのイントロダクションによれば、

最初のTTはビューの名前がTTであることをスクリプトに教えます。次のTTはそれがTemplate Toolkitのビューであることを示すものです。

じゃあ最初の方の「TT」は名前何でも良かったゆうことやね。

Model

あとはModelか。
Modelはドメインロジックだから変わらず前のlib/MyHatena/Tag.pm使えるように思うけれど、まあ全部ヘルパーでひな形作っておこう。

$ script/myhatena_web_create.pl model Tag::Search
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/Model/Tag"
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/Model/Tag/Search.pm"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t/model_Tag-Search.t"
$ script/myhatena_web_create.pl model Tag::Result 
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/Model/Tag"
 exists "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../lib/MyHatena/Web/Model/Tag/Result.pm"
created "/Users/rightgo09/Script/Perl/catalyst_test/MyHatena-Web/script/../t/model_Tag-Result.t"

実装する

実装の順番ってやっぱひとそれぞれなのかな。

その前に

テストファースト

いつもの自分ならControllerのディスパッチを試しつつModelを仕上げていく、みたいな感じになるけど、テストファーストというのを試しにやってみたい。
(Wikipediaでは「テスト駆動開発 - Wikipedia」になってた)
いろいろ試したい年頃。
要するにテストケースを先に書く。
ああ、今までTestについて学んだことが役に立つ時がきた!

Model's Test

Modelのテスト。
ModelのTag::Search.pmが作られた時に一緒にできるtファイルを変更する。

t/model_Tag-Search.t
use strict;
use warnings;
use Test::More;

BEGIN { use_ok 'MyHatena::Web::Model::Tag::Search' }

# add start
{ # Query Exist
  my $result = MyHatena::Web::Model::Tag::Search->search('Perl');
  isa_ok $result => 'MyHatena::Web::Model::Tag::Result';
  if (my @entries = $result->entries) {
    my $result0 = $entries[0];
    is ref($result0) => 'MyHatena::Web::Model::Tag::Search';
  }
}
{ # No-String Query Exist
  my $result = MyHatena::Web::Model::Tag::Search->search(q{});
  isa_ok $result => 'MyHatena::Web::Model::Tag::Result';
  my @entries = $result->entries;
  ok !scalar(@entries);
}
{ # Undef Query
  my $result = MyHatena::Web::Model::Tag::Search->search(undef);
  isa_ok $result => 'MyHatena::Web::Model::Tag::Result';
  my @entries = $result->entries;
  ok !scalar(@entries);
}
# add end

done_testing();

何も参考にしないで書いてみた。
何という絶望感。これでいいのか……。
なんかテストできてる気がしないし、恥ずかしいけど、未来の自分のために晒しておこう。
とにかくこれにあうように実装していけばいいというわけだ。


(2010/02/15 22:26 追記)
あまりにだめだったんで、ちょっと修正。
タイポとかok()とか。
not_ok()なんてなかった…。