如何在创建工厂之前强制FactoryGirl创建父级?

时间:2017-04-04 10:20:00

标签: ruby-on-rails factory-bot

我有一个事件模型,保存后会更新父用户的某些属性。

class User
  has_many :events
end

class Event
  belongs_to :user
  before_save :update_user_attributes

  validates :user, presence: true

  def update_user_attributes
    self.user.update_attributes(hash_of_params)
  end
end

大部分时间都可以正常工作 - 用户必须存在并在与事件交互之前登录。

但是我的测试套件引起了问题,特别是事件工厂。

FactoryGirl.define do
  factory :event do
    user
  end
end

似乎由于FactoryGirl构建事件的顺序,在创建事件时用户不可用,导致update_user_attributes失败。

这意味着

create(:event)
# ActiveRecord::RecordNotSaved:
# Failed to save the record

但是

build(:event).save

传递没有错误

我可以通过多种方式阻止引发错误,例如,检查user.persisted?方法中的update_user_attributes,或运行callaback after_save。但我的问题特别与FactoryGirl有关。

鉴于上述事实,有没有办法在创建事件之前强制创建关联的用户?

1 个答案:

答案 0 :(得分:2)

您可以在FactoryGirl中编写回调:

FactoryGirl.define do
  factory :event do
    user

    before(:create) do |event|
      create(:user, event_id: event.id)
    end
  end
end

这是docs link

还有关于FG回调的article on thoughtbot