2012-03-19 117 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