(1)Rails默認提供了快速生成示例數據的工具,叫作"固件"。固件是一個YAML格式的文件,能夠用來生成示例數據。例如:數據庫
contacts.ymlruby
aaron: firstname: "Aaron" lastname: "Sumner" email: "aaron@everydayrails.com"
在測試中能夠引用contacts(:aaron),能夠得到一個聯繫人,全部屬性都附上了值,可是固件有缺點:函數
固件中的數據很容易被破壞工具
Rails在把固件存入test庫時,會跳過數據驗證測試
(2)預構件Factory Girl的使用,例:ui
spec/factories/contacts.rbcode
FactoryGirl.define do factory :contact do firstname "John" lastname "Doe" sequence(:email) { |n| "johndoe#{n}@example.com" } end end
在測試中使用FactoryGirl.create(:contact)(存數據庫)FactoryGirl.build(:contact)(不存數據庫)使用,sequence保證了n遞增,每次郵箱不一樣,在有惟一驗證時能夠使用對象
同時預構件Factory Girl也有本身的問題繼承
會拖慢測試ci
當模型關聯很複雜時,預構件很差維護
(3)從Factory Girl 3.0開始,只須要作一些配置就能夠省略預構件調用時前面的FactoryGirl,配置以下:
spec/spec_helper.rb
RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods end
(4)預構件中的關聯,能夠使用association方法,它會告知FactoryGirl,若是沒有把電話所屬的聯繫人傳遞給build方法(或create方法),就新建一個聯繫人
(5)預構件中的繼承,相同的屬性能夠寫在頂層factory中,而不一樣的屬性使用嵌套的factory區分,如:
FactoryGirl.define do factory :phone do association :contact phone { '123-555-1234' } factory :home_phone do phone_type 'home' end factory :work_phone do phone_type 'work' end end end
(6)使用faker生成更真實的數據,如:
Faker::PhoneNumber.phone_number
Faker::Name.first_name
Faker::Name.last_name
Faker::Internet.email
(7)FactoryGirl中也有after回調函數,例:
FactoryGirl.define do firstname { Faker::Name.first_name } lastname { Faker::Name.last_name } email { Faker::Internet.email } after(:build) do |contact| [:home_phone, :work_phone, :mobile_phone].each do |phone| contact.phones << FactoryGirl.build(:phone, phone_type: phone, contact: contact) end end end
(8)若是測試變得很慢,最好去掉預構件了的關聯,手動加入所需的數據或則使用純Ruby對象生成數據