そうだ、rails3でfactory_girlをつかおう!

Ruby

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を利用していたときの、こんがらがったデータの嵐とさよならできそうです。

タイトルとURLをコピーしました