2013-01-21 41 views
3

我正在使用FactoryGirl和RSpec來測試我的代碼。 Mongoid在我的ORM中。我遇到的問題是,爲了創建一個嵌入式文檔,您還必須創建父文檔。這裏有一個例子:如何使用FactoryGirl創建嵌入式文檔?

# app/models/recipe.rb 
class Recipe 
    include Mongoid::Document 

    field :title 

    embeds_many :ingredients 
end 

# app/models/ingredient.rb 
class Ingredient 
    include Mongoid::Document 

    field :name 

    embedded_in :recipe 
end 

然後我讓工廠爲這兩種:

# spec/factories/recipes.rb 
FactoryGirl.define do 
    factory :recipe do |f| 
    f.title "Grape Salad" 
    f.association :ingredient 
    end 
end 

# spec/factories/ingredients.rb 
FactoryGirl.define do 
    factory :ingredient do |f| 
    f.name "Grapes" 
    end 
end 

我現在的問題是,我永遠不能叫FactoryGirl.create(:成分)。原因是嵌入了Ingredient,而我的Ingredient工廠從不聲明與配方的關聯。如果我確實聲明瞭配方的關聯,那麼我會得到一個無限循環,因爲配方與配料關聯,配料與配方關聯。這很煩人,因爲我無法正確地測試我的Ingredient類。我怎麼解決這個問題?

回答

4

如果你的目標很簡單,就是單元測試嵌入式成份類,那麼這將是最好避免做「創造」到數據庫中共有,並簡單地實例化對象阿拉...

FactoryGirl.build(:ingredient) 

這將避免實際上將對象持久化到MongoDB中。否則,從Mongoid/MongoDB的角度來看,嵌入式文檔不能在沒有父節點的情況下存在於數據庫中,所以如果必須將對象保存到數據庫中,則必須通過父節點執行此操作。

相關問題