3

次のようなファクトリでいっぱいのファイルがある場合:

FactoryGirl.define do
  factory :city do
    name "My City"
    state "MI"
    latitude 50
    longitude -80
    association :country
  end
  factory :waukegan_city, class: City do
    name "Waukegan"
    state "IL"
    latitude "42.36"
    longitude "-87.81"
    association :country
  end
  factory :amherst_oh, class: City do
    name "Amherst"
    state "OH"
    latitude 41.36170
    longitude -82.25380
    association :country
  end
end

できます:

FactoryGirl.create(:city)
FactoryGirl.create(:waukegan_city)
FactoryGirl.create(:amherst_oh)

しかし、これらすべてを一度に作成する方法はありますか(つまり、個々のファクトリを指定せずに、すべてのファイルにすべてのファクトリを作成することなく)?

4

2 に答える 2

3

特定のクラスのすべてのファクトリを一度に作成するには、build_classメソッドを使用してそれらの特定のファクトリを識別できます。

Ruby オブジェクトの機能に慣れていないときはいつでも、Ruby オブジェクトのメソッドを調べて、自分のニーズを満たすと思われるメソッドを試します。この場合、これが私がこれを理解した方法です:

  1. 次の行を仕様の 1 つに追加しました。

    puts FactoryGirl.factories.first.methods
    
  2. その 1 つの仕様だけを実行し、コンソールで出力を観察しました。最初に表示されたいくつかのメソッドは次のとおりです。

    name
    definition
    add_callback
    declare_attribute
    to_create
    define_trait
    constructor
    defined_traits
    inherit_traits
    append_traits
    build_class
    run
    human_names
    associations
    names
    
  3. build_classファクトリが属するクラスが表示されるように思えたので、手順 1 で追加した行を次のように置き換えてみました。

    puts FactoryGirl.factories.map(&:build_class)
    

    それは確かにすべての工場のクラス名を私に与えました。

  4. 次のステップは、特定のクラスに属するファクトリのみを見つけ、それらを繰り返し処理してそれぞれを作成することでした。

    city_factories = FactoryGirl.factories.select { |f| f.build_class == City }    
    city_factories.each { |f| FactoryGirl.create(f.name.to_sym) }
    
于 2015-05-28T17:03:21.463 に答える
1

これを試して:

FactoryGirl.factories.each do |factory|
  FactoryGirl.create(factory.name)
end
于 2014-03-04T16:09:01.710 に答える