taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

Perlでのfactory_girlもどきのもの

 ちょっと作ってみた。
 → taiyoh/p5-Test-Factory · GitHub
 PerlだとO/R Mapperが乱立しまくってて何かに依存したモジュールにするのは汎用性が低すぎてないわー、って感じだったので、DBISQL::MakerでDB毎の処理は抽象化させて、SQL的にはinsertだけに絞って機能を提供するようにした。その点ではRubyActiveRecordの影響力が絶大で楽。
 factory_girlほど高機能じゃないけど、作ったパターンをベースに統一されたインターフェイスからデータオブジェクトを生成できる(&DBにそのデータを突っ込む)、ってことについてはとりあえずできる。

package Foo;

use Test::Factory;

my $foo_counter = 0;

factory foo => {
    col1 => 'hoge',
    col2 => 'fuga',
    col3 => 'piyo',
    col4 => sub { ++$foo_counter }
};

package main;

# O/R Mapperではないので、内部でDBI使って自前でinsertする
Foo->dsn("dbi:mysql:dbname;host=localhost", 'db username', 'db password', {});

my $f1 = Foo->build('foo');
print $f1->created; # => 0 (false)
print $f1->col4; # => 1


my $f2 = Foo->build('foo');
print $f2->col4; # => 2

$f1->save; # insert into foo (col1, col2, col3, col4) values (?, ?, ?, ?) /* hoge, fuga, piyo, 1 */

my $f3 = Foo->create('foo');
print $f3->created; # => 1 (true)
print $f3->col4; # => 3