【问题标题】:Accessing factory_girl factories in *other* factories访问 *other* 工厂中的 factory_girl 工厂
【发布时间】:2011-01-15 01:48:50
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    FactoryGirl.define do
       factory :thing do
         user
       end
    end
    

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

    【讨论】:

      【解决方案2】:

      你应该使用这个代码:

      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 (这可能是你想要的)。

      【讨论】:

      • 这很好用。只要知道Factory(:valid_user) 语法已被弃用;请改用FactoryGirl.create(:valid_user)。
      • 当我尝试构建时使用create(:valid_user)(:valid_thing)实际上会进行创建,对吗?有没有办法让这个引用泛型根据被调用来创建/构建?
      • @mpgarate - 不,构建不会
      • Factory(:valid_user) 语法在这一点上不仅被弃用;它现在完全消失了,没有弃用消息。您可以简单地使用create(:valid_user),而不使用FactoryGirl。
      【解决方案3】:

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

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

      【讨论】:

      • 你也可以t.association :user, factory: :valid_user
      猜你喜欢
      • 2011-05-18
      • 2021-10-25
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2013-10-24
      • 2011-10-11
      相关资源
      最近更新 更多