使用FactoryGirl创建具有所需关联的对象

时间:2012-10-22 00:53:40

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

我正在寻找有关如何在处理具有许多必需关联对象的对象时有效使用ruby gem“FactoryGirl”的建议。

例如,假设我的班级之间有以下关系。

class A < ActiveRecord
  has_many B
end

class B < ActiveRecord
  belongs_to A
  has_many C
end

class C < ActiveRecord
  belongs_to B
end

现在,如果我想为我的C控制器编写测试用例,我必须在这个链中创建所有对象。现在,这就是我在工厂里做的事情。但是有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

如果您的工厂设置如下:

FactoryGirl.define do
  factory :library do
    name "Chicago Public Library"
    street_address "123 Morgan St."
  end

  factory :book do
    title "A Great Book"
    author "Mandy Yeats"
    association :library
  end

  factory :page do
    page_number 123
    association :book
  end
end

每当您在测试中创建:page的实例时,FactoryGirl还将创建:book和:library的实例。您不需要先创建库和书。如果您创建:book,则还将为测试创建a:库。您可以在测试中使用这些实例,如下所示:

page.book.library.name       # after using FactoryGirl.create(:page)
page.book.author

book.library.street_address  # after using FactoryGirl.create(:book)

这是我找到的最简单的方法。