2012-08-24 74 views
8

鉴于两款车型,警报和邮政编码,其中一个警报必须有1层或多个邮编:如何用FactoryGirl定义嵌套工厂?

class Alert < ActiveRecord::Base 
    attr_accessible :descr, :zipcode 

    has_many :zipcode 
    validates :zipcode, :length => { :minimum => 1 } 
end 

class Zipcode < ActiveRecord::Base 
    attr_accessible :zip 
    belongs_to :alert 
end 

我怎样写我的FactoryGirl工厂,使:

  • 邮编工厂在自己的定义文件
  • 警报工厂在自己的文件中定义
  • 警报可以依赖Zipcode定义的工厂吗?

我所阅读的所有文档和示例都希望您在父工厂文件中定义所包含的类,将它们全部混合在一起,或者采取其他一些妥协或解决办法。有没有一种干净的方式来保持规格工厂分开?

回答

12

诀窍在于确保容器类(即其定义中具有has_many语句的容器类)在Factory Girl中创建包含的类作为数组。例如:

在你的投机/工厂/ zipcodes.rb:

FactoryGirl.define do 
    factory :zipcode do 
    zip { 78701 + rand(99) } 
    end 
end 

而且在规格/工厂/ alerts.rb:

FactoryGirl.define do 
    factory :alert do 
    zipcode { Array.new(3) { FactoryGirl.build(:zipcode) } } 
    end 
end 
相关问题