テスト用 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 を書いてみよう。(後でこのエントリに追記する)