テスト用 DB の準備を行うモジュールを作った

Catalyst 本を参考に、やっつけで書いてみた。
Catalyst 本との違いは fixture に対応している点。
使い方(Test::WWW::Mechanize::Catalyst と連携等)や解説は、近いうちに書く。後で Helper にする。

package MyApp::Test::Database;

use strict;
use warnings;

use Directory::Scratch;
use MyApp::Schema;
use FindBin qw($Bin $Script);
use YAML::Syck;

use base 'Exporter';
our @EXPORT = qw(schema);

my $schema;
my $config;

BEGIN {
    my $tmp = Directory::Scratch->new;
    my $db  = $tmp->touch('database');
    my $dns = "DBI:SQLite:$db";

    $schema = MyApp::Schema->connect($dsn);
    $schema->deploy;

    $config = "$Bin/../conf/myapp_local.yml";
    DumpFile($config, {'Model::DBIC' => {connect_info => [$dsn]}});

    _load_fixture();

    sub _load_fixture {
        my $fixture_file = "$Bin/fixture/$Script";
        $fixture_file =~ s/\.t$/.yml/;
        return if ! -f $fixture_file;

        my $fixture_for = LoadFile($fixture_file);
        while (my ($model, $fixtures) = each %$fixture_for) {
            for (@$fixtures) {
                $schema->resultset($model)->create($_);
            }
        }
    }
}

END {
    unlink $config;
}

sub schema {
    $schema;
}

1;

便利な CPAN Modules があった
Jonathan Rockway 氏作 の DBICx::TestDatabase が良さ気。
SQLite を利用してテスト用の一時データベースを作ってくれる。
source を覗いたら $schema->deploy を実行していた。
私が書いた Module と異なり myapp_local.yml を生成してくれないので、直接 Controller を叩くテストには使えない。
これに tokuhirom 氏作の Test::Fixture::DBIC::Schema を組み合わせて、テスト用の Module を書いてみよう。(後でこのエントリに追記する)