2011-07-11 396 views
4

有没有办法阻止Rails在运行测试之前清除测试数据库?我想使用我的生产数据库的副本进行测试,因此我需要防止rails每次清除数据。Ruby on Rails - 测试数据库

有相当多的数据,所以我想尽可能避免使用灯具,因为我假设每次都需要很长时间来填充数据库。

谢谢, 迈克

+1

测试的关键在于让数据库充满可预测的数据,这些数据不会因一次测试而改变。通过使用生产数据,您将失去这一优势。我真的会考虑用'FactoryGirl'来为你模拟数据库数据。 – iwasrobbed

回答

0

让我说你一般不希望使用生产数据进行测试前言本。这就是说...

你可以加载“种子”数据,但确保你没有任何固定装置,否则它会被删除,每次测试运行。

查看this answer了解如何自动生成数据。

6

您可以通过运行测试,避免手动

ruby -Itest test/unit/some_test.rb 

这是耙的任务,做测试分贝娱乐(你可以手动像这样运行它)

rake db:test:prepare 

但我的建议是你做错了。 测试中的一般想法是,您知道数据库的状态,因此知道对函数的期望。

例如。

test "search_by_name" do 
    expected = User.all.select{|u| u.name =~ /arthur/i} 
    assert_equal expected, User.search_by_name("Arthur") 
end 

是一个很好的测试 但是,如果你不知道该数据库的状态,你怎么知道有一个阿瑟?

上面的测试会通过三种不好的情况;

  1. 没有用户记录
  2. 所有的用户称为“亚瑟”
  3. 没有用户叫阿瑟。

所以它更好地创建一个虚假的现实, 我们知道数据库的状态。

我们想;

  1. 至少一个具有名称“亚瑟”名称为“亚瑟”
  2. 至少一个用户为另一单词
  3. 至少一个非用户亚瑟的一部分用户。

更好的测试,假设db是空的,并且使用factory girl,可能是。

test "search_by_name" do 
    expected = [ 
    Factory.create(:user, :name => "Arthur"), 
    Factory.create(:user, :name => "MacArthur") 
    ] 
    not_expected = [Factory.create(:user, :name => "Archer")] 
    assert_equal expected, User.search_by_name("Arthur") 
end 
+0

这没有奏效。 ruby -Itest ...命令删除了我的表中的数据。架构保持不变,但数据已被删除。但是,关于已知数据的观点很好。我现在正在使用测试进行用户界面验证,因此我想使用生产数据,以便查看(并测试)用户看到的内容。但更好的办法可能是获得我需要的表格,创建固定装置/种子并以这种方式进行。谢谢你的回答,我很感激 – hoitomt