Ruby Factory Girl创建多个对象

时间:2012-01-31 18:43:34

标签: ruby-on-rails-3 testing mocking factory factory-bot

我是使用Factory Girl的新手,我觉得我可能会对如何工作以及我应该如何使用它产生一些误解。以下是问题代码的片段。

FactoryGirl.define do                      
   factory :li_store , :class => Store do   
   ...store stuff...blah...blah         
end                                      

factory :li_line_item_stores_two,:class=>LineItemsStore do   
   association :store, :factory=>:li_store                    
   association :line_item , :factory=>:li_line_item_two                                                         
end                                                             
factory :li_line_item_stores_three,:class=>LineItemsStore do 
   association :store :factory => :li_store                                   
   association :line_item , :factory => :li_line_item_three                                                 
end

现在,如果我访问:li_line_item_stores_two和:li_line_item_stores_two,每个人的商店属性都有不同的对象。对于我的测试,我需要两个对象具有相同的商店对象。

有谁知道我错过了FactoryGirl的哪些方面,或者我应该如何确保两个对象都引用相同的商店对象?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您希望在factories.rb文件中定义 baseline 对象和属性。您不希望定义一组对象的不同相同版本。相反,factories.rb应该类似于:

FactoryGirl.define do
  factory :li_store do 
    whatever
  end

  factory :li_line_item do
    whatever
  end

  factory :li_line_item_store do
    association :store, :factory => :li_store
    association :line_item, :factory => :li_line_item
  end
end

然后,您的测试中可以覆盖这些属性(或者可以保留基线值):

def test_something
  store = Factory(:li_store)
  li_line_item_store_one = Factory(:li_line_item_store, :store => store)
  li_line_item_store_two = Factory(:li_line_item_store, :store => store)
end

通过上述内容,您现在拥有两个具有不同订单项和同一商店的li_line_item_store实例。