2013-08-18 96 views
0

我正在嘗試爲動作創建編寫rspec測試。控制器是OrderController。 訂單模型包含許多訂單項。我不知道我能做到這一點的呼叫:Rspec,factory_girl - 測試用has_many模型創建動作

後:創建,順序:FactoryGirl.build(:順序).attributes

但這種失敗,因爲我的驗證,即說:訂單應該有至少一個訂單項。我認爲我應該創建一個有訂單項的訂單。

非常感謝。

+0

你在問什麼可以完成(使用LineItems構建Order ...)。但它不會解決你的問題。因爲您要調用的#attributes不會在返回的哈希中包含訂單項。如果需要,您應該使用文字散列或通過輔助函數生成它。我認爲在這裏使用FactoryGirl並不明智(至少從我看到的情況來看)。 – jurglic

回答

1

您可以在factory_girl中定義關聯。

factory :order_line do 
    #some attributes 

    order 
end 

factory :order do 
    #some attributes   

    #the line's count you want to create 
    ignore do 
     lines_count 5 
    end 

    after(:create) do |order, evaluator| 
     FactoryGirl.create_list(:order_line, evaluator.lines_count, order: order) 
    end 
end 

因此,當您使用factory_girl創建訂單時,您也將構建一些行。

+0

@ User426891以上內容來自https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations,您可以參考FactoryGirl的更多信息。 –

1

您可以使用FactoryGirl構建關聯的對象。不過,你有兩個選擇:

1)手動/明確的方法 - 在這裏你通過line_items進廠電話:

FactoryGirl.build(:order, line_items: [build(:line_item), build(:line_item)] 

2)自動方法 - 配置工廠總是至少包括一個行項目:

在你的工廠文件:

factory :order do 
    # attrs 

    after :build do |order, ev| 
    order.line_items << build(:line_item) 
    end 
end 

這將建立具有默認屬性一個默認LINE_ITEM工作。如果你想有更多具體的屬性,你必須回到使用第一種方法。