2016-01-21 59 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