データを返すようなモデルメソッドのテストは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が返って来るはずだ」とかのテストデータ作るのとか考えただけで萎える。
それではいつもの
神に感謝。
この文だけ見ると何か俺危ない宗教の信者みたい。