FactoryGirl child的after(:create)回调在创建父项时不运行

时间:2016-01-21 22:35:42

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

我有以下内容:

# spec/factories/card.rb
FactoryGirl.define do
  factory :card do |f|
    first_name 'First Name'
    [...]
    emails { [ build(:email, :active) ] }
  end
end

我正在使用build发送电子邮件,因此我不会收到电子邮件belongs_to :card的错误。

# spec/factories/email.rb
FactoryGirl.define do
  factory :email do |f|
    address 'test@test.com'
  end

  trait :active do
    after(:create) do |email|
      email.active = true
      email.save
    end
  end
end

我的电子邮件型号:

# app/models/email.rb
class Email < ActiveRecord::Base
  belongs_to :card
  before_save :set_confirm_key

  def set_confirm_key
    if address_changed?
      self.confirm_key = SecureRandom.urlsafe_base64(15)
      self.active = false
      return
    end
  end
end

问题是我的电子邮件模型上有before_save回调,它将active设置为false,如果我FactoryGirl.create(:card),则不会在电子邮件工厂中调用after(:create)挂钩所以我总是收到不活跃的电子邮件。

1 个答案:

答案 0 :(得分:1)

我相信你的问题是你没有在工厂女孩中创建电子邮件。 FactoryGirl构建它,因此after(:create)不会被调用。当父母离开FactoryGirl时,电子邮件会被保存。

我会尝试另一种方法:

factory :card do
  after(:create) do |card, evaluator|
    create_list(:email, 1, card: card, :active)
  end
end

我相信这会奏效。