将多个现有模型实例链接到FactoryGirl对象

时间:2017-11-15 05:20:03

标签: ruby-on-rails factory-bot

作为简化视图,我有以下模型:

class LineItem
  belongs_to :service, polymorphic: true
  belongs_to :line_item_template, optional: true
end

class LineItemTemplate
  belongs_to :service, polymorphic: true
  has_many :line_items
end

class ServiceOne
  has_many :line_items, as: :service
  has_many :line_item_templates, as: :service
  after_create :create_line_item_templates

  def create_line_item_templates
    # ...
  end
end

class ServiceTwo
  has_many :line_items, as: :service
  has_many :line_item_templates, as: :service
  after_create :create_line_item_templates

  def create_line_item_templates
    # ...
  end
end

因此,在创建ServiceOneServiceTwo的实例后,会创建相应的line_item_templates并将其链接到该服务。

请务必注意line_item_templates中的LineItem关联是可选的。

我想创建一个工厂,创建一个LineItem链接到新创建的ServiceOne,但也链接到LineItemTemplate回调中创建的ServiceOne#after_create

我正在尝试实现但未能正常工作的伪代码如下:

FactoryGirl.define do
  factory :line_item
    service {|t| t.association :service_one}
    line_item_template_id self.services.first.line_item_templates.first.id
  end
end

如何在工厂中实现这一目标?

1 个答案:

答案 0 :(得分:0)

我确信有更好的方法可以做到这一点,但我提出的解决方案如下:

使用after(:build)回调对我的各种测试至关重要,因为这意味着无论使用FactoryGirl.build还是FactoryGirl.create,它都会

FactoryGirl.define do
  factory :line_item do
    sequence(:description) {|n| "Line Item #{n}"}
    service {|t| t.association :service_one}
  end

  factory :service_one_line_item, parent: :line_item do
    after(:build) do |li|
      li.line_item_template_id = li.service.line_item_templates.first.id
    end
  end

  factory :service_two_line_item, parent: :line_item do
    after(:build) do |li|
      li.service = FactoryGirl.create(:service_two)
      li.line_item_template_id = li.service.line_item_templates.first.id
    end
  end
end