MVCその6
続き。
はてブのタグを検索キーワードにして、新着記事を一覧にして表示するプログラムをCatalystで作る。
最初に参考サイト「404 Not Found」。
スケルトン
じゃあまずはスケルトンを作る。
$ 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()なんてなかった…。