Factory Girl 是專門用來構造模擬測試數據的,完美替代Fixture的工具。
Fixture的缺點很明顯,經常要處理各種關聯和依賴。如果測試要求的數據量大,還要自己手動製造數據。這些在Factory Girl中都有了好的解決。生成大量數據可以用association來解決對象間的關聯,sequence來解決生成大量測試數據的問題。
添加Factory Girl
#Gemfile
group :development, :test do
gem 'factory_girl_rails'
end
最好修改spec_helper.rb,把fixture_path這一行註釋掉,禁用Fixture
# /spec/spec_helper.rb
# config.fixture_path = "#{::Rails.root}/spec/fixtures"
Factory Girl使用原則
1、每個model都定義一個factory。
2、如果model比較少就把所有的factory定義放到一個文件spec/factories.rb中。
如果model比較多且複製,則每上model在spec/factories/目錄下單獨建立一個文件[model_names]s.rb
在rspec中三種常見寫法
user = Factory(:user) #相當於new+save!
user = Factory.create(:user) #同上,是全寫
user = Factory.build(:user, :username => 'camel') #只有new沒有save
一個例子
#spec/factories.rb
FactoryGirl.define do
factory :user do
sequence(:email){|n| "email#{n}@factory.com" }
password "888888"
password_confirmation "888888"
end
factory :post do
title "Hello"
association :user
#association :author, :factory => :user #關聯另一個用戶,同時定義一個別名。
end
end
在Rspec中調用方法
post = Factory(:post)
其實上面代碼相當於:
user = User.new
user.email = "[email protected]"
user.save!
post = Post.new
post.title = "Hello"
post.user = user
post.save!
更多請參考:https://github.com/thoughtbot/factory_girl
>>原文鏈接地址:Factory Girl使用方法的一些彙總