访问*其他*工厂中的factory_girl工厂

时间:2010-02-10 00:51:48

标签: ruby-on-rails tdd factory factory-bot

我在rails应用程序中使用factory_girl插件。对于每个型号,我都有一个包含工厂数据的相应ruby文件,例如

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  # t.user ???
end

我有很多不同类型的用户(已在用户工厂中定义)。如果我尝试以下方法:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.user Factory(:valid_user) # Fails
end

我收到以下错误:

# No such factory: valid_user (ArgumentError)

:valid_user实际上是有效的 - 我可以在我的测试中使用它 - 只是不在我的工厂中。有什么办法可以在这里使用另一个文件中定义的工厂吗?

3 个答案:

答案 0 :(得分:31)

您应该使用以下代码:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.user { Factory(:valid_user) }
end

在{}中包含调用会导致Factory Girl在创建:valid_thing工厂之前不评估大括号内的代码。这将强制它等到:valid_user工厂已加载(您的示例因为尚未加载而失败),它还将导致为每个创建一个新的:valid_user:valid_thing而不是为所有人创建相同的用户:valid_thing(可能是你想要的)。

答案 1 :(得分:4)

尝试使用关联方法,如:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.association :valid_user
end

答案 2 :(得分:3)

可能是Factory Girl根据问题的年龄判断的新功能,但如果Factory中属性的名称与工厂名称相同,则只需调用工厂中属性的名称即可填充它与相关的工厂生成。

FactoryGirl.define do
   factory :thing do
     user
   end
end

这应该导致用户字段查找具有相同名称的工厂并从中填充它。