如何防止“rake test”删除“rake db:seed”数据?

时间:2013-02-27 22:55:26

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 rake-test

我的Ruby版本是ruby 1.9.3p385。我的Rails版本是3.2.12。

我使用以下内容加载测试数据库:

rake db:seed RAILS_ENV=test

一切都很好。所有工厂女孩的东西装得很好。

test / factories.rb的内容包含工厂。 db / seeds.rb的内容很简单:

FactoryGirl.create(:music_categorization)
FactoryGirl.create(:dance_categorization)

现在,当我使用以下命令运行测试时:

rake test

Rails删除所有种子数据,测试失败。我想要一种防止“rake test”删除数据的方法。

我去的另一条路线是加载种子数据,作为“rake test”命令的一部分,如question中所述。然而,最终做的是加载测试数据两次(基本上由于某种原因,db / seeds.rb被调用两次)。我放弃了这条路线,现在只想做以下操作来运行我的测试:

rake db:seed RAILS_ENV=test
rake test

感谢任何帮助。我基本上想要阻止rake测试删除我的数据或找出一种没有db / seeds.rb调用两次的方法。

2 个答案:

答案 0 :(得分:1)

首先,我要说的是,一般情况下,您不应该在测试中使用种子数据。测试应该使用空数据库运行,并且您只创建每个测试所需的数据。

在您的情况下,您似乎还没有理解种子数据的含义,这基本上是您的应用程序需要正常工作的核心数据。如果您需要在测试中实例化几个模型,只需(假设您正在使用rspec)

    before(:each) do
      FactoryGirl.create(:music_categorization)
      FactoryGirl.create(:dance_categorization)
    end

如果您仍希望使用种子数据运行测试,您可以随时尝试运行rspec,这将只运行所有rspec示例,保留测试数据库。但是相信,那不是你想要的。

答案 1 :(得分:1)

AFAIK通常不会使用db:seed为测试加载数据,它通常仅用于加载种子数据以用于开发目的。

相反,您应该在实际测试文件中创建测试数据。通常在每次测试后使用类似database_cleaner的内容删除测试数据,因此每个测试都以空数据库开始。

例如,在rspec中,您可以在let块,before块或测试本身中加载测试数据,例如

require 'spec_helper'

describe Page do
  let(:user) { FactoryGirl.create(:user) }

   before do
     # create some data
   end

  it '#name returns XYZ' do
    page = FactoryGirl.create(:page, :user => user)
    page.description.should == 'XYZ'
  end

  it '#description returns ABC' do
    page = FactoryGirl.create(:page, :user => user)
    page.description.should == 'ABC'
  end
end