2016-01-21 60 views
0

回调不跑我有类似如下:FactoryGirl孩子后(:创建)创建父母的时候

# 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 '[email protected]' 
    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回调这台积极为假,如果我做FactoryGirl.create(:card)后(:创建)钩没有按”不要在电子邮件工厂打电话,所以我总是收到不活动的电子邮件。

+0

请显示您的before_save回调。已添加 – boulder

+0

电子邮件模型。 – janosrusiczki

回答

1

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

我想尝试另一种方法:

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

我相信会工作。

+0

我明白你的解释,为什么回调没有执行,但问题是,我在卡模型上至少会查找一封电子邮件的验证器,所以我无法在卡创建后添加电子邮件。 – janosrusiczki

+1

它没有一个简单的解决方案。没有电子邮件就无法创建卡片,并且不能在没有卡片的情况下创建电子邮件,而且您还需要在电子邮件模型中保存后。我不认为你可以绕过FactoryGirl。在我看来,您需要在重置电子邮件的活动字段的规范中编写回调之前。 – boulder

+0

谢谢,我结束了这样做。我浪费了太多时间来追逐我的尾巴。 – janosrusiczki