2015-12-07 37 views
4

我想爲Rails應用程序構建測試套件,但我不確定如何使用FactoryGirl構建對象(如果需要,我可以移動到其他工具) 。與RSpec/FactoryGirl建立嵌套關聯的最佳方式

棘手的部分是,有有很深的嵌套的關聯,讓我們例如模式的這一部分:http://imgur.com/HAUS7kr

比方說,我想要做的「ItemTracker」模式的一些測試。現在有2種方法:

  • 爲了有一個有效的對象,我需要建立一個聯接,這需要一個令牌,這需要一個項目,等等。另外,我要的項目項的項目與Token的項目一樣。與公司一樣(在上面)。我不想要創建2個不同的項目或公司。所以我需要一種方式讓這些對象共享一些關聯。這種方法的一個缺點是,我不知道如何使不創建幾個關聯的對象,我也要建立一個我不一定需要的對象(除了驗證)

  • 我可以說「對於這個特定的測試,這些關聯是不相關的,所以我只是創建一個ItemTracker,沒有它的Connexion或者ProjectItem,並且用這個孤立的對象來做我的事情。通常情況下,我只是創建實際需要的對象和關聯。通過玩特質,我找到了一種避免創建關聯的方法,如果我不需要它們的話。缺點是這個對象是無效的(對關聯有驗證),所以每次我會試着在它上面保存一些東西時,我會有一個異常,這在某些測試用例中會很痛苦。

所以我想我的問題是:在這種複雜的對象結構中設置一些用於測試的對象的最佳方法是什麼?

感謝您的反饋意見;)

回答

1

你總有需要興建這整個關係樹,但你可以把它變成特質,並在規範,建立項目跟蹤與特質with_all_relations,例如。它看起來是這樣的:

FactoryGirl.define do 
    factory :item_tracker do 
    ... 
    trait :with_all_relations do 
     after(:build) do |item_tracker| 
     company = create(:company) 
     item = create(:item, company: company) 
     user = create(:user, company: company) 
     ... 
     item_tracker.project_item = project_item 
     item_tracker.connexion = connexion 
     end 
    end 
    end 
end 

如果你沒有指定特質,你會得到沒有任何相關模型的物品跟蹤器。

1

我希望ProjectItem的項目與Token的 項目相同。與公司一樣(在上面)。我不想有2個 不同的項目或創建

公司

您可以通過重寫initialize_with使用「命名的」工廠:

factory :project do 
    # define common attributes for projects 

    factory :project_1 do 
    initialize_with do 
     Project.find_or_create_by(name: "Project 1") 
    end 
    end 
end 

現在,你可以通過關聯添加:

association :project, factory: project_1 

並在不同型號的協會中獲得相同的項目。

請注意,這氣味很像一個夾具,所以你可能會考慮如果裝置比你的情況工作更好。

我只想創造我真正需要的對象和關聯。通過玩特質,我找到了一種避免創建關聯的方法,如果我不需要它們的話。缺點是這個對象無效

我建議創建每個工廠的「基本」版本,只允許您設置屬性,即使沒有關聯,即使這是無效的。然後擴展它以通過添加關聯來創建有效的(並且可能無效的)版本。 Jeiwan's answer是一個很好的例子。

相關問題