20

我在我的 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 实际上是有效的——我可以在我的测试中使用它——只是不能在我的工厂中使用。有什么办法可以在这里使用另一个文件中定义的工厂吗?

4

3 回答 3

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_thing 创建一个新的 :valid_user 而不是为所有用户创建相同的用户:valid_thing's (这可能是你想要的)。

于 2010-02-10T06:00:57.040 回答
4

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

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.association :valid_user
end
于 2010-02-10T03:13:22.350 回答
3

从问题的年龄来看,这可能是 Factory Girl 的一个新功能,但如果您在工厂中的属性名称与工厂名称相同,则只需调用工厂中的属性名称即可使用相关的工厂代。

FactoryGirl.define do
   factory :thing do
     user
   end
end

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

于 2017-03-01T07:14:14.660 回答