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对象生成数据

相关文章
相关标签/搜索