読者です 読者をやめる 読者になる 読者になる

どこぞのエンジニアなマネージャーのブログ。

Perlとかviとかcssとかjavascriptとか(rubyとか)git >> https://github.com/rozary hatenaIDがrozrayなのはtypo

ORマッパーとDBD::Mockは、あまり相性が良くない??

perl

DBD::Mockは、名の通りDBのモック。
DBD::Mock - search.cpan.org

先ずは、DBD::Mockの説明。

my $dbh = DBI->connect("DBI::Mock:");
$dbh->{mock_add_resultset} = {
  sql     => 'SELECT foo, bar FROM baz',
  results => [
    [ 'foo', 'bar' ],
    [ 'this_one', 'that_one' ],
    [ 'this_two', 'that_two' ],
  ],
}

my $result = $dbh->selectall_arrayref("SELECT foo, bar FROM baz");

って感じで。
$resultには、上のresultsの

[
  [ 'foo', 'bar' ],
  [ 'this_one', 'that_one' ],
  [ 'this_two', 'that_two' ],
]

が入っている感じ。

で、この時注意しないといけないのが、

mock_add_resultsetに入れてあるsqlと全く同じものじゃないとresultが返ってこないんです。
大文字小文字も、同じにするくらいにね。

※ mock_add_resultsetに、参照配列を渡すこともできます。
この時は、sqlのチェックを無視して、値を返してくれます。

ここで、問題なんです。

ORマッパーを使うと、まぁクエリが自動で生成されます。
そんなもんで、大文字小文字も気にするくらい合わせないといけないのでちょっと手間だなぁという。

ちなみに、自分はTengとDBD::Mockで試していたのですが、
Tengでは、FROMやWHERE、LIMITで改行が入るので、改行もDBD::Mockのsql内に含めないと動かなかったです。

ということで、DBD::Mock自体はシンプルに書けるところはよいのでそういう時に使いましょう。