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

Mic*_*lle 20 tdd factory ruby-on-rails factory-bot

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

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  # t.user ???
end
Run Code Online (Sandbox Code Playgroud)

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

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

我收到以下错误:

# No such factory: valid_user (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

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

Gde*_*lin 31

您应该使用此代码:

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

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

  • 这很好用.只知道`Factory(:valid_user)`语法已被弃用; 使用`FactoryGirl.create(:valid_user)`代替. (11认同)
  • "Factory(:valid_user)"语法此时不仅被弃用; 它已经完全消失了,没有弃用消息.您可以简单地使用`create(:valid_user)`,而不使用`FactoryGirl`. (3认同)

Pet*_*own 4

尝试使用关联方法,例如:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.association :valid_user
end
Run Code Online (Sandbox Code Playgroud)