2012-09-17 97 views
0

我一直在RSPEC中使用工廠女孩,但本月我的任務是將黃瓜故事實施到我們的測試套件中。我想我可能有一個我不太確定的問題。將一些FactorGirl模型與一個主公司的模型關聯起來

我們的'主'賬戶模式被稱爲'公司'。用戶,僱員等等都屬於這一點。有些通過代表團直接通過f/k他人。我們以前使用工廠女孩的方式設置了許多與Factory女孩搭配的模型。

即在 'spec_helper.rb'

@grade_system = FactoryGirl.create(:grade_system) 
@asset_size = FactoryGirl.create(:asset_size) 
@asset_size.grades.create!(FactoryGirl.attributes_for(:grade)) 
@company = FactoryGirl.create(:company, :asset_size => @asset_size, :grade_system => @grade_system) 

這是相當愚蠢的海事組織。

當試圖修復具有「屬性已定義:asssociation」的適當關聯的工廠時,我總是收到錯誤。我猜測是因爲用屬於員工的工廠創建的用戶,都是由擁有關聯公司的工廠構建的,正在導致衝突。但這不是唯一的例子。我想我的問題是,這種情況的最佳做法是什麼。我覺得如果我可以把一家公司分出來,分配給所有需要它的工廠,這可能會起作用,或者將所有適當的協會分配到公司工廠中,但是不能用FactoryGirl建立一個用戶.build(:用戶)。 ....或者我只是錯過了關於協會如何工作的觀點?

FactoryGirl.define do 
    factory :company do 

    sequence(:name)     { |n| "Company#{n}" } 
    sequence(:subdomain)    { |n| "subdomain#{n}" } 
    first_time_setup     false 

    non_exempt_multiplier    1.2 
    exempt_multiplier     1.2 
    executive_multiplier    1.2 

    primary_contact_first_name   'Jarrett' 
    primary_contact_last_name   'Green' 
    primary_contact_email    '[email protected]' 
    primary_contact_phone    '(555) 555-5555' 
    hours_considered_part_time   30 
    hours_considered_full_time   40 

    association :industry 
    association :grade_system 
    association :asset_size 

end 
end 

###################################### 

FactoryGirl.define do 
    require 'faker' 
    factory :employee do 

    association :company 
    association :position 
    association :branch 

    first_name    Faker::Name.first_name 
    last_name     'Smith' 
    pay_basis     'salary' 
    current_salary   10000.00 
    date_in_position   (Date.today) 
    sequence(:internal_id) { |n| n } 

    user 
    end 
end 

############################################################ 

FactoryGirl.define do 
    factory :user do 
    association :company 
    sequence(:login)   {|l| "user#{l}@test.com"} 
    sequence(:first_name)  {|fn| "UserFirstName#{fn}"} 
    sequence(:last_name)  {|ln| "UserLastName#{ln}"} 
    password     'thisisthepassword' 
    password_confirmation  'thisisthepassword' 
    end 
end 
+1

您能否展示如何爲Commpany,AssetSize和GradeSystem定義工廠? – mguymon

+0

剛剛與我認爲是相關的工廠編輯。 – Jarrett

回答

1

處理此問題的一個有趣方法是使用Fixtures作爲父記錄,然後在工廠中定義它們。每創建一個模型有效固定,然後你可以在工廠的定義如下分配給它:

association : grade_system { GradeSystem.find(12345678) } 

,其中數字是夾具的ID。

這種方法有幾個好處。首先,速度很快,因爲每次創建子項時都不會創建父記錄,在測試運行開始時加載一次燈具並始終保持不變。其次,很簡單,每個燈具根據燈具的名稱給定一個id數字 - 每次運行都相同,因此您可以直接使用find直接使用 - 它們也可以輕鬆鏈接關聯,因此您不需要在建造工廠時創建父母的父母。第三,它是靈活的,如果需要在創建或建造工廠時進行測試,您總是可以傳入另一個父級。

您可以避免使用燈具的大部分問題,因爲您只能爲父母創建每種類型的其中一種。

相關問題