2012-07-01 39 views
0

我們的rails應用程序中有user和user_level。用戶has_many user_levels。我們建立FactoryGirl數據設置如下:如何在FactoryGirl 3.3中爲has_many關聯設置子參數?

factory :user_level do 
    position    "admin" 
    user 
    end 

    factory :user do 
    login     'testuser' 
    password    "password1" 

    #user_levels 
    after(:build) do |user| 
     user.user_levels << FactoryGirl.build(:user_level, :user => user) 
    end 
    end 

的問題是如何重置位置user_level,例如,銷售?以下不起作用:

ul = FactoryGirl.attributes_for(:user_level, :position => 'admin') 
    user = FactoryGirl.create(:user, :login => 'test', :password => 'password', 
          :user_levels => ul) 

錯誤是「未定義的方法」每個'「。用build代替attributes_for會產生相同的錯誤。在工廠的user_level中重置位置的正確方法是什麼?謝謝。

回答

1

您的錯誤與FactoryGirl無關,但與純軌道無關。您要添加一個模型實例一:的has_many關係,應當由數組喂,所以嘗試:

ul = FactoryGirl.attributes_for(:user_level, :position => 'admin') 
user = FactoryGirl.create(:user, :login => 'test', :password => 'password', 
         :user_levels => [ul]) 
+0

它解決了未定義方法'每個'的錯誤。對於attributes_for,AssociationMisMatch存在錯誤。對於構建,沒有代碼錯誤。但是它表示該電子郵件是重複的(但表中沒有用戶記錄,除了正在創建的記錄)。如果刪除:user_levels => [ul],則rspec沒有錯誤。 – user938363

+0

只需導軌安裝,除了在工廠中定義的默認值之外,似乎:user_levels => [ul]爲創建的用戶添加了一個user_level。很奇怪,不是嗎? – user938363

1

有一對夫婦的方式在用戶級別重置孩子的參數。

  1. 通過重置參數添加第二個用戶級別(或更多),同時保留after(:build)回調中定義的默認user_level。

FactoryGirl如下:

factory :user_level do 
    position    "admin" 
    user_id    1 
    end 

    factory :user do 
    login     'testuser' 
    password    "password1" 

    #user_levels 
    after(:build) do |user| 
     user.user_levels << FactoryGirl.build(:user_level, :user => user) 
    end 
    end 

ul = FactoryGirl.build(:user_level, :position => 'sales') 
user = FactoryGirl.create(:user, :user_levels => [ul]) 

上面創建的用戶將具有兩個位置,一個是「管理員」作爲默認值,所述第二一個是作爲一個與復位位置「銷售」的位置值。

  1. user_level需要反饋給用戶創建。所有的user_level參數都可用於重置。

FactoryGirl如下(沒有用戶回調):

factory :user_level do 
    position    "admin" 
    user_id    1 
    end 

    factory :user do 
    login     'testuser' 
    password    "password1" 
    end 

ul = FactoryGirl.build(:user_level, :position => 'sales') 
user = FactoryGirl.create(:user, :user_levels => [ul]) 

上面創建的用戶將僅具有一個位置 '銷售'。您可以根據需要自由地爲用戶創建添加更多用戶級別。