2012-03-19 142 views
1

我想優化我的規格。我通常在爲嵌套資源和用戶創建測試數據時遇到問題。我通常最終會建立一個之前(:每個)設置數據,這是由我的規格超過120個運行。讓我告訴你:(這是不準確的,但你應該明白了吧)RSpec Rails測試數據

def setup_test_data 
    @user = FactoryGirl.create(:admin_with_account) 
    @account = @user.account 
    3.times do |n| 
    list = FactoryGirl.create(:list) 
    list.items << FactoryGirl.create_list(:item, 3) 
    @account.lists << list 
    end 
end 

before(:each){setup_test_data} 

subject{List.merge(list1, list2)} 
it{should have(6).items} 

這裏是爲什麼我不能縮短我的測試數據建立

def self.merge(lists) 
    merged_list = lists.first.account.subscriber_lists.build 
    name = "Merge of " 
    lists.each do |list| 
    name << "'#{list.name}', " 
    list.items.each do |item| 
     merged_list.items.build(item.dup.attributes) 
    end 
    end 
    merged_list.name = name.chop.chop 
    merged_list.save! 
    merged_list.reload # I use this to filter out duplicates via validations 
end 

我的選項: A)移動一些邏輯回控制器,該帳戶依賴較少,保存在控制器 B)存根/嘲笑多了很多,但與嵌套資源+協會很難在這裏做

C)你的想法:

感謝 雷

回答

0

C)創建自己的RSpec耙的任務,將首先導入一些基本數據,然後使用DatabaseCleaner,以確保一切事務上運行(您將有後您的自定義Rake任務手動清除DB,因爲出於某種原因它似乎不是,但使用DatabaseCleaner這是一個單行)。

我使用這種情況下,我有一個大的預定義的數據集,我需要測試,並希望它被創建一次,然後測試執行事務對它。

如果這吸引你,讓我知道,我可以提供更多的代碼來幫助你。

+0

謝謝,我想這可能是最好的方法。我使用fixture_builder設置了一堆燈具,然後讓我的setup_data方法將它們從數據庫中拉出來。我仍然在努力工廠序列以及DatabaseCleaner的工作方式。但是我真的不想嘲笑和琢磨那麼多,對每個規範進行的一些集成測試在過去對我很好。它只是比較慢,並不總是帶有漂亮的代碼。 – Ray 2012-03-20 09:42:38

+0

那麼如果你有更多的問題隨時問! Factory女孩擁有相當不錯的文檔,DatabaseCleaner在他們的GitHub頁面上也是如此,所以這是一個很好的開始。嘲笑和殘留不是你應該回避的事情,因爲測試很重要,簡而言之,它們可以幫助你編寫重複測試或「不良」測試。 – MrDanA 2012-03-20 17:08:25