这两个FactoryGirl声明之间的实际区别是什么?

时间:2013-10-15 00:34:51

标签: ruby-on-rails factory-bot

我发现这个错误让我花了太长时间才能找到。

我有这个:

FactoryGirl.define do
  factory :global_list do
    list_id FactoryGirl.create(:user).liked_items_list.id
  end
end

但只是包裹在一个区块中:

FactoryGirl.define do
  factory :global_list do
    list_id { FactoryGirl.create(:user).liked_items_list.id }
  end
end

所以我知道在第二次调用中,阻塞导致它在运行像FactoryGirl.create(:global_list)这样的实际调用之前不会运行;我认为这已经过去并通过FG转换为proc。还有其他实际差异吗?我希望有一种方法可以在详细模式下运行它们。

thx任何见解

1 个答案:

答案 0 :(得分:1)

两种情况之间的本质区别是:

  1. 在第一种情况下(无块),在加载工厂时会评估list_id表达式,而不再重复。加载工厂时生成的list_id将用于工厂创建的所有对象。因此,所有global_list对象都具有相同的list_id。

  2. 在第二种情况下(带有块),只要调用工厂(例如,调用build(:global_list),create(:global_list)),就会计算list_id表达式。如果表达式产生的list_id发生变化,那么不同的工厂对象将具有不同的list_id。