Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-03-13

モデルのfunctional test

| 22:54 |  モデルのfunctional test - dann@catalyst を含むブックマーク はてなブックマーク -  モデルのfunctional test - dann@catalyst  モデルのfunctional test - dann@catalyst のブックマークコメント

DBICx::TestDatabaseとTest::Fixture::DBIC::Schemaを使ってモデルのテストをしてみた。大体イメージどおりの感じで使えるかなぁと。

テスト用のDBクラス

DBICx::TestDatabaseを使っている。将来的に拡張する可能性があるため継承をしておく。

package MyApp::Test::DBIC::Database;
use strict;
use warnings;
use base qw(DBICx::TestDatabase::Subclass MyApp::Schema);

1;

モデルのテスト用のベースクラス。

setupでfixture作成. Test::Fixture::DBIC::Schemaでfixtureのロード.

package MyApp::Test::Model::Base;
use strict;
use warnings;
use base qw/Test::Class/;
use MyApp::Test::DBIC::Database;
use Test::Fixture::DBIC::Schema;
use File::Spec;

sub setup: Test(setup) {
    my $self = shift;
    $self->_make_fixture($self->model,$self->fixture);
}

sub _make_fixture {
    my $self = shift;
    my $model = shift;
    my $fixture = shift;

    $self->{schema} = MyApp::Test::DBIC::Database->connect();
    my $fixture_path = File::Spec->catfile('t','fixtures', $self->fixture . ".yaml");
    my $data = construct_fixture(
        schema  => $self->{schema},
        fixture => $fixture_path,
    );
    $self->{model} = $self->{schema}->resultset($model);
}

sub teardown : Test(teardown) {
};

sub fixture {
    my $self = shift;
    die "need to override";
}

sub model {
    my $self = shift;
    die "need to override";
}

1;

テストコード

モデルのテストクラスは、MyApp::Test::Model::Baseを継承する。fixtureとmodelメソッドをオーバーライドすると、該当するfixtureがロードされる。各テストメソッド間では、テーブルの内容は削除されるので、メソッド間に依存関係はない。

#!perl
use strict;
use warnings;

MyApp::Test::Model::Feeds->runtests;

package MyApp::Test::Model::Feeds;
use base qw/MyApp::Test::Model::Base/;
use Test::More;

sub test_feed : Tests {
    my $self = shift;

    my $feed = $self->{model}->find(1);
    is $feed->id, 1;
    is $feed->feedlink, "http://example.net/rss";
}

sub fixture {
    return "feeds";
}

sub model {
    return "Feeds";
}

1;

fixture

t/fixtures/feeds.yaml

t/fixturesに置くのは、Railsのパクリ。

- schema: Feeds
  name: entry1
  data:
    id: 1
    feedlink: http://example.net/rss
    link: http://example.net
    title: Example
    description: This is Example site
    subscribers_count: 1

- schema: Feeds
  name: entry2
  data:
    id: 2
    feedlink: http://example2.net/rss
    link: http://example2.net
    title: Example2
    description: This is Example2 site
    subscribers_count: 2

検討事項

  • SQLiteでテストする必要がなければ、Test::Fixture::DBIC::Schemaだけでいいなぁ。ここらはSQLiteでのテストが必要かも含めて少し検討かな。
    • モデルのテストはSQLiteだけ、結合テストのときだけMySQLでという選択肢もありえるかもしれない。
  • DB使わないでモデルをテストするユニットテスト用のベースクラスも作成する
  • fixture作るのが面倒. SQLでデータ流し込んで、YAMLDBからDumpする仕組みを用意したほうがいいかも

CarrieCarrie2011/08/02 22:59This website makes tghins hella easy.

uqkmntyamuqkmntyam2011/08/04 23:04LV0GWW , [url=http://ssntczkglidm.com/]ssntczkglidm[/url], [link=http://ybwyazadkvxq.com/]ybwyazadkvxq[/link], http://tnhbhzdyqjob.com/

xixywzesscxxixywzesscx2011/08/05 22:32WrlimC , [url=http://uxhjuacepxav.com/]uxhjuacepxav[/url], [link=http://mgietljruzer.com/]mgietljruzer[/link], http://tumkfemdvdet.com/