0

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

我有这个:

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 任何见解

4

1 回答 1

1

这两种情况的本质区别在于:

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

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

于 2013-10-15T02:27:04.340 回答