データを返すようなモデルメソッドのテストはfixtureだ

ロジックや、booleanとか値を返すようなメソッドのテストは書けるようになった。
データベースからの問い合わせ結果、DBICでいうResultSetを返すようなメソッドではどう書けばいいか分からなかった。
ということをTwitterでぼやいたら天から神の声が降ってきた。

それfixtureでできるよ
普通にやろうとすると超大変だけど(意訳)

そういえばそんな名前のディレクトリがrailsの中にあったなーと思いつつググる
テスト用のデータを作ってそこに対してテストする的な。なるほど。


大変なのはめどいのでググる。Test::Fixture::DBIC::Schemaというモジュール発見。
以下ほぼSYNOPSISまま。

Schema.pm

package Schema;
use strict;
use parent 'DBIx::Class::Schema::Loader';

1;

fixture.yaml

- schema: User
  name: test 1st
  data:
    id: 1
    name: test name
    age: 4

fixture.pl

#!/usr/bin/perl
use strict;

use Test::Fixture::DBIC::Schema;
use Schema;

my $schema = Schema->connection(
    'dbi:mysql:fixture_test:localhost:3306',
    'root',
    '',
    {AutoCommit => 1},
);

my $data = construct_fixture(
    schema  => $schema,
    fixture => 'fixture.yaml',
);

fixture.pl実行。

mysql> select * from user;
+----+-----------+------+------------+------------+
| id | name      | age  | created_at | updated_at |
+----+-----------+------+------------+------------+
|  1 | test name |    4 | NULL       | NULL       |
+----+-----------+------+------------+------------+
1 row in set (0.00 sec)

正に打ってつけ。実行するたびに残ってるデータ全部消してくれるし。
あとモジュールのソースも参考になる。データ読んでバリデートして既存データ消してから作成と。
これでデータだろうがページングだろうが件数だろうがテストできるな。
問題はテストデータ作るのがめどいことか。「〜〜の場合は5件でページングしたら3 5 34 23 44が返って来るはずだ」とかのテストデータ作るのとか考えただけで萎える。

それではいつもの

神に感謝。
この文だけ見ると何か俺危ない宗教の信者みたい。