2012-06-27 105 views
2

我有一個具有has_one配置文件的用戶模型。當我像這樣創建用戶時,配置文件會自動創建;當我已經在模型中創建關聯時,如何測試與FactoryGirl具有has_one關聯的模型

class User < ActiveRecord::Base 
    has_one :profile, dependent: :destroy 
    after_create :create_profile 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

這一切都很好,每個用戶都會創建一個默認配置文件。

雖然我想對我的用戶模型進行一些測試,但這正是我掙扎的地方。

我使用FactoryGirl並希望創建這樣一個用戶,以便

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|n| "user_#{n}@example.com"} 
    sequence(:username) {|n| "user_#{n}"} 
    password "secret" 
    factory :activated_user do 
     before(:create) {|user| user.activated = true} 
     association :profile, factory: :profile_for_activated_user 
    end 
    end 
end 

FactoryGirl.define do 
    factory :profile do 
    factory :profile_for_activated_user do 
     first_name "Johnny" 
     last_name "User" 
    end 
    end 
end 

這是不如意的事情對我來說。 after_create回調(我想要的)會覆蓋FactoryGirl創建的關聯(在FactoryGirl.create :activated_user上),所以我最終得到一個空白的配置文件和失敗的測試。我是否需要改變在模型中創建關聯的方式(我不應該 - 我不應該修改我的代碼以適合我的測試工具),還是有辦法在FactoryGirl中進行管理?我應該在FactoryGirl中創建用戶後,在我的測試中手動分配配置文件屬性?

回答

2

可以跳過after_create回調是這樣的:

FactoryGirl.define do 
    factory :user do 
    after(:build) { |user| user.class.skip_callback(:create, :after, :create_setting) } 
    end 
end 
+0

這是偉大的,雖然after_build給予了取消通知。我在(:build)之後使用,它完美地工作。謝謝。 – brad