代码之家  ›  专栏  ›  技术社区  ›  Craig Walker

与工厂里的孩子们建立联系

  •  41
  • Craig Walker  · 技术社区  · 16 年前

    Foo 有很多“酒吧”。我有一个工厂和一个女孩工厂为这些对象。这家酒吧工厂与福有联系;它将在创建条时实例化一个Foo。

    我想要一个工厂,创建一个Foo包含一个酒吧。理想情况下,这个Bar将通过:Bar工厂创建,并遵循用于创建Foo的构建策略(create/build)。

    我知道我可以打电话给:酒吧工厂,然后从新酒吧里拿到Foo的参考资料。我想避免这样;在我的测试用例中,重要的对象是Foo;给酒吧工厂打电话似乎有点迂回。另外,我可以看到需要一个Foo与多个酒吧。

    这在工厂里可能吗?您如何在父级中定义这种关系?

    5 回复  |  直到 16 年前
        1
  •  50
  •   theUtherSide adragom    8 年前

    这个 Factory.after_ hooks 似乎是唯一成功的方法。我找到了一种在不重复代码的情况下维护构建策略的方法:

    Factory.define :foo do |f|
      f.name "A Foo"
      f.after(:build) { |foo|
        foo.bars << Factory.build(:bar, :foo => foo)
      }
      f.after(:create) { |foo|
        foo.bars.each { |bar| bar.save! }
      }
    end
    

    这个 documentation 声明 after_build after_create 如果 :create :build 生成后 被召唤,每个人都很快乐。

    我还创建了一个抽象的通用版本 at this gist

        2
  •  4
  •   Robert Speicher    16 年前

    association 两种方法:

    Factory.define :foo do |f|
      # ...
      f.association :bar
    end
    

    Factory.define :live_raid do |raid|
    end
    
    Factory.define :live_raid_with_attendee, :parent => :live_raid do |raid|
      raid.after_create { |r| Factory(:live_attendee, :live_raid => r) }
    end
    
        3
  •  3
  •   bjnord    14 年前

    :method => :build 您可以在关联上使用的选项,它将构建关联的对象,而不是创建它。

    #64: Building an object creates associations

        4
  •  3
  •   mgp    12 年前

    FactoryGirl 4.3.0正在呼叫 save! build 在父对象上,我认为这不是正确的行为。

    在翻阅了FactoryGirl代码之后 strategy: :build 救命! .

        5
  •  2
  •   Epigene    11 年前

    使用 factory_girl-4.5.0

    FactoryGirl.define do
      factory :foo do
        name "test"        
    
        after(:build) do |instance|
          n.times { instance.bars << FactoryGirl.create(:bar) }          
        end
      end
    end