Fixturesを利用してテストを書いていくと、リレーションの定義がファイルをまたいでわかりづらくなったり、同じようなデータなのだけど、少しだけ違うデータが増えていったり、とにかく大変になる。
factory_girl_rails
GitHub - thoughtbot/factory_bot_rails: Factory Bot ♥ Rails
Factory Bot ♥ Rails. Contribute to thoughtbot/factory_bot_rails development by creating an account on GitHub.
Fixture Replacementと呼ばれるツールで、Fixturesを利用することなくテストのためのモデルオブジェクトを生成してくれます。このオブジェクトは継承して、一部だけ違うオブジェクトを作成したりということが容易にできたり、一部のデータはユニークに自動生成したりといったことができます。
rails3-generators
GitHub - indirect/rails3-generators: Rails 3 compatible generators for gems that don't have them yet
Rails 3 compatible generators for gems that don't have them yet - indirect/rails3-generators
モデルをジェネレーターで生成したときに、factory_girlのひな形を生成してくれる。
インストール
Gemfile に以下のように記述する
group :development, :test do
gem 'factory_girl_rails'
gem 'rails3-generators'
end
gem をインストールする。
$ bundle update
実際のテストコード(RSpec)
villageモデルオブジェクトとuserモデルオブジェクトはリレーションしています。リレーションが正常に動作していることを確かめるテストしか書いていませんが、通常通りモデルオブジェクトに対するテストも書けます。
require 'spec_helper'
Factory.define :village do |v|
v.name 'テストの村'
v.interval 60
v.start_at Time.now
v.user_id { |user| user.association(:user) }
end
Factory.define :user do |u|
u.nickname 'テストのニックネーム'
u.displayname 'テストのディスプレイネーム'
u.thumbnailurl 'http://test.com/test.jpg'
u.hasApp true
u.platformuserid 'abcdefg123456'
u.mixiid '12345'
u.updated Time.now
end
describe Village do
context 'リレーションの動作確認' do
before do
@village = Factory.create(:village)
end
it { @village.user.nickname.should == 'テストのニックネーム' }
it { @village.user.displayname.should == 'テストのディスプレイネーム' }
it { @village.user.thumbnailurl.should == 'http://test.com/test.jpg' }
it { @village.user.hasApp.should == true }
it { @village.user.platformuserid.should == 'abcdefg123456' }
it { @village.user.mixiid.should == 12345 }
end
end
これで、Fixturesを利用していたときの、こんがらがったデータの嵐とさよならできそうです。