FactoryGirl以及Faker的使用

(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對象生成數據

相關文章
相關標籤/搜索