0

RSpec と FactoryGirl を使用して、Ruby-on-Rails-3 アプリケーションをテストしています。私は工場の階層を使用しています:

FactoryGirl.define do
  factory :local_airport do

    ... attributes generic to a local airport

    factory :heathrow do
      name    "London Heathrow"
      iata    "LHR"
    end

    factory :stansted do
      name "Stansted"
      iata "STN"
    end

    ... more local airports
  end
end

私の RSpec では、親ファクトリを指定してすべての子ファクトリを作成できるようにしたい場合があります。理想的には、次のようなものです。

describe Flight do
  before( :each ) do
    # Create the standard airports
    FactoryGirl.find( :local_airport ).create_child_factories
  end
end

よろしくお願いします。

4

2 に答える 2

0

FactoryGirl コードを数時間掘り下げた後、解決策を見つけました。興味深いことに、FactoryGirl はファクトリ内の親への参照のみを格納し、親から子への参照は格納しません。

spec/factories/factory_helper.rb:

module FactoryGirl
  def self.create_child_factories( parent_factory )
    FactoryGirl.factories.each do |f|
      parent = f.send( :parent )
      if !parent.is_a?(FactoryGirl::NullFactory) && parent.name == parent_factory
        child_factory = FactoryGirl.create( f.name )
      end
    end
  end
end

私の RSpec では、次のように記述できます。

require 'spec_helper'

describe Flight do
  before( :each ) do
    # Create the standard airports
    FactoryGirl.create_child_factories( :local_airport )
  end

  ...

私が見つけた落とし穴の 1 つは、単純な (つまり 2 レベルの) ファクトリ階層を持つことが最善であるということです。私は 3 層の階層から始めて、階層の一部としてのみ存在する「抽象的な」工場を生成していることに気付きました。特性を使用して、階層を 2 つのレベルに単純化しました。

于 2013-07-14T18:25:38.500 に答える