【问题标题】:How to get all factory_girl factories defined for a particular model class?如何获取为特定模型类定义的所有 factory_girl 工厂?
【发布时间】:2016-01-10 05:04:42
【问题描述】:

我在<Rails-root>/spec/factories/models.rb 中定义了一个工厂:

FactoryGirl.define do
  factory :model do
    id 1
    association :organization, factory: :aureso
    name "Default Model"

    factory :serie_1 do
      id 2
      name 'serie_1'
    end

    factory :serie_2 do
      id 3
      name 'serie_2'
    end

    factory :serie_3 do
      id 4
      name 'serie_3'
    end
  end
end

我想获取为 Class Model 定义的所有工厂。

我可以使用FactoryGirl.factories 获取所有类的工厂定义,是的,我可以使用 map/reduce 实现上述目标。但我想知道是否有任何帮助方法来获取模型类的所有定义。

【问题讨论】:

  • 我真的不明白你在说什么。工厂基本上是代表某种模型的对象。 ActiveModel 模型是一个包含验证和其他普通 ruby​​ 内容的类,它是 ActiveRecord::Base 类的一部分,模型从该类继承。如果你说的是所有工厂之间的一些共享逻辑,你可以使用特征。
  • 你应该为不同的模型创建不同的工厂。删除id属性,因为id是由数据库创建的。
  • 我正在使用 fixture-builder (github.com/rdy/fixture_builder),我希望 id 是自定义的,这对排序很有用。这不会给我带来任何问题。我只是想知道在这种情况下是否有办法让所有工厂引用模型类:model(class name Model)。

标签: ruby-on-rails ruby ruby-on-rails-4 factory-bot rspec3


【解决方案1】:

the source 可以看出,当前版本的 factory_girl (4.5.0) 中的FactoryGirl 类没有一种方便的方法来列出创建给定类实例的工厂。

这不是一个非常令人兴奋的答案,所以让我们以不方便的方式来做吧! FactoryGirl.factories 返回一个FactoryGirl::Registry,它再次没有方便的方法来列出工厂,但确实有一个@items 散列,其键是工厂名称,其值是FactoryGirl::Factory 的实例。给定Factory 构建实例的类由Factory#build_class 返回。所以我们可以列出构建给定类实例的工厂

FactoryGirl.
  factories.
  instance_variable_get('@items').
  select { |name, factory| factory.build_class == SomeClass }.
  keys

由于它依赖于内部,它肯定会在未来崩溃。

【讨论】:

  • 很好。感谢@items。你能找到我提到实例变量的源代码(或文档)吗?
  • 我做到了!点击链接到FactoryGirl::Registry
  • 由于FactoryBot::RegistryEnumerableFactories,您可以在不访问@items 的情况下执行此操作(尽管它仍然使用未记录的API):FactoryBot.factories.select { |f| f.build_class == SomeClass }.map(&:name)
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2013-09-20
  • 2021-12-18
  • 1970-01-01
  • 2018-12-24
相关资源
最近更新 更多