FactoryGirl以及Faker的使用

(1)Rails默认提供了快速生成示例数据的工具,叫做"固件"。固件是一个YAML格式的文件,可以用来生成示例数据。例如:

contacts.yml

aaron:
    firstname: "Aaron"
    lastname: "Sumner"
    email: "[email protected]"

在测试中可以引用contacts(:aaron),可以获得一个联系人,所有属性都附上了值,但是固件有缺点:

    固件中的数据很容易被破坏

    Rails在把固件存入test库时,会跳过数据验证

(2)预构件Factory Girl的使用,例:

spec/factories/contacts.rb

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也有自己的问题

    会拖慢测试

    当模型关联很复杂时,预构件不好维护

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


你可能感兴趣的:(FactoryGirl以及Faker的使用)