如何从母工厂获得儿童工厂

时间:2013-07-06 07:23:02

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

我正在使用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

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

你无法真正告诉工厂建立它的所有子工厂,因为作为子工厂只是意味着它继承了父工具的属性。但你可以做的是添加一个特征,例如:with_child_factories。然后你的工厂将如下所示:

    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

        trait :with_child_factories do
          after(:create) do
            FactoryGirl.create(:heathrow)
            FactoryGirl.create(:stansted)
            ...
          end
        end
      end
    end

然后您可以使用

在测试中调用它
        FactoryGirl.create(:local_airport, :with_child_factories)

答案 1 :(得分: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

  ...

我发现一个问题是最好有一个简单的工厂层级(即两个级别)。我从一个三层层次结构开始,发现我正在生成一个抽象的'只存在于层次结构中的工厂。我已经使用特征将层次结构简化为两个级别。