2010-09-24 120 views
2

我正在爲一個Ruby on Rails應用程序編寫一些RSpec測試,並且遇到了我似乎無法解決的問題。我有一堆與其他人關聯的對象,我使用Factory Girl來創建它們。下面是我遇到問題的示例:工廠女孩用Ruby on Rails進行測試,依賴關係

user = Factory.create(:user) 
    package = Factory.build(:package, :user => user) 
    item = Factory.create(:item, :package => package) 

所有軟件包屬於用戶,因此第一個依賴關係相當平凡。創建一個用戶然後將它與一個包關聯起來,沒問題。現在是問題所在。我的包模型有一個驗證,說它不能在包中至少包含一個項目的情況下創建。這意味着我不能使用Factory.create。這與在我的packages_controller.rb中執行@ Package.new幾乎是一樣的,這很好。後來,我繼續創建一個項目,問題是,我無法將該項目與包裹關聯,因爲該包裹尚無ID。

是否有無論如何我可以創建我的包,創建一個項目並保存它,然後將這兩個關聯在一起,一旦包有一個ID?

回答

2

退房協會:

http://github.com/thoughtbot/factory_girl

相關實例可以使用時 定義lazy屬性的關聯方法產生 :

Factory.define :post do |p| 
    # ... 
    p.author {|author| author.association(:user, :last_name 
    'Writely') } end 

這樣你可以自動創建所需的相關項目。

你會想是這樣的:

Factory.define :package do |fac| 
    fac.association :item 
end 

這會尋找一個名爲工廠項目,並嘗試將其分配給項目=關係。

0

你的驗證是相互排斥的:

我的包模式有一個驗證的是 說,它不能在沒有在 至少一個項目在包中創建

和:

(1)創建我的包,(2)創建一個項目,然後 保存,然後(3)將兩個 關聯在一起,一旦包有id?

您需要允許創建一個包才能獲得一個id。什麼是空的包裹無效?也許需要一些其他邏輯來防止它被進一步使用,但是在填充它之前應該可以創建一個包。

0

如果我說得對,你的邏輯看起來有點偏離。要有包裝,必須有項目;有ITEM,必須有包裝。至少其中的一個必須被允許創建而不需要另一個。

如果這有幫助,這裏是您如何自動創建對工廠本身的依賴。在這個例子中,包取決於用戶和物品取決於包。這裏的魔法是方法協會

當然,您必須正確完成模型關聯。

(首先,用戶廠)

FactoryGirl.define do 
    factory :user do 
    name { "Some_Name" } 
    end 
end 

(然後,包裝廠,其取決於用戶)

FactoryGirl.define do 
    factory :package do 
    description { "Some_Description" } 
    user { association(:user) } 
    end 
end 

(然後,項目,這取決於封裝)

FactoryGirl.define do 
    factory :item do 
    description { "Some_Description" } 
    package { association(:package) } 
    end 
end 

希望它有幫助!