2014-01-09 38 views
0

有一部分BDD我真的很困惑。我有各種不同的請求規格來測試。結構如下:如何使用FactoryGirl構建嵌套模型是否存在Rails約定?

  • 用戶的has_many產品
  • 產品的has_many PriceLevels
  • PriceLevel的has_many價格

我感到困惑如何去使用FactoryGirl設廠。我熟悉協會和特質的概念。我熟悉buildcreate的概念。但我不確定在什麼情況下使用這些。

我可以溝通我感到困惑的最好方法就是舉一些例子。

  • 我有一個請求規格來測試User註冊。出於顯而易見的原因,我不在這裏使用工廠。這我明白。

  • 我有一個請求規格來測試User創建新的Products。我用戶工廠爲create。我假設我需要在這裏使用create而不是build,因爲ProductsController中的CRUD方法在通過URL傳遞的id上執行AR find。如果我在這裏錯了,請糾正我。

  • 我有一個請求規格測試爲Product添加不同的PriceLevels。這裏我使用兩個工廠:UserProduct

  • 我有一個請求規範來測試UserProductPriceLevel添加不同Prices。現在我最多有3家工廠:UserProductPriceLevel

現在,如果Price有類似Currency一個has_and_belongs_to_many?工廠正在失控。

我想說當我到PriceLevel時,我想要一個工廠,讓我一次創建整個結構。然而,我不想每次創建整個結構。另外,這些工廠可以從下到上或從上到下創建。

哪種方式更好,自下而上或自上而下?我可以創建DRY代碼,讓我可以選擇單個工廠或一次創建整個shebang嗎?我可以將after(:create)區塊包裹在特徵中嗎?我會在請求規格中使用build vs create嗎?

非常感謝您的關注!

回答

1

首先,build VS create在請求規格:

我通常被磕碰Model.find返回內置實例使用buildbuild_stubbed在控制器的規格。但是,在特性或請求規格中應該避免使用一般的嘲諷,因此請繼續閱讀並在此處說明create的事情。

現在至於主要問題:

這聽起來像是一個完美的特質案例。一般來說,基地工廠應該只有製造有效模型所需的屬性。然後可以使用特徵爲普通或冗長的場景製作方便的「別名」。

您可以使用before(:create)來構建和分配相關模型。當FG最終在內部呼叫save/create時,Rails將處理所有事情。

例子:

factory :user do 
    # ... 

    trait :with_products do 
    before(:create) do |user| 
     user.products = build_list(:product, 3) 
    end 
    end 

    trait :with_priced_products do 
    before(:create) do |user| 
     user.products = build_list(:product, 3, :with_prices) 
    end 
    end 
end 

factory :product do 
    # ... 

    trait :with_prices do 
    before(:create) do |product| 
     product.prices = build_list(:price, 3) 
    end 
    end 
end 

factory :price 

如果你想定製多少產品/價格在編譯時添加,只需將它添加ignore d的屬性,並通過在─的2參數形式使用它們鉤。

ignore do 
    number_of_products 3 
end 

before(:create) do |user, evaluator| 
    user.products = build_list(product, evaluator.number_of_products) 
end 

如果你希望能夠在buildbuild_stubbed方案中使用這些with_特質,你將不得不重複使用在各種情況下的正確戰略的相關掛鉤。目前還沒有簡單的方法可以說「使用與模型相同的策略添加一些關係」,儘管這也是我自己的願望清單項目。

相關問題