标签:
(1)Rails默认提供了快速生成示例数据的工具,叫做"固件"。固件是一个YAML格式的文件,可以用来生成示例数据。例如:
contacts.yml
aaron: firstname: "Aaron" lastname: "Sumner" email: "aaron@everydayrails.com"
在测试中可以引用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对象生成数据
标签:
原文地址:http://my.oschina.net/u/1413049/blog/398102