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

シェアする

  • このエントリーをはてなブックマークに追加

Fixturesを利用してテストを書いていくと、リレーションの定義がファイルをまたいでわかりづらくなったり、同じようなデータなのだけど、少しだけ違うデータが増えていったり、とにかく大変になる。

スポンサーリンク

factory_girl_rails

Fixture Replacementと呼ばれるツールで、Fixturesを利用することなくテストのためのモデルオブジェクトを生成してくれます。このオブジェクトは継承して、一部だけ違うオブジェクトを作成したりということが容易にできたり、一部のデータはユニークに自動生成したりといったことができます。

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

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする