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