1

我的 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”命令的一部分。但是,最终会加载两次测试数据(基本上 db/seeds.rb 出于某种原因被调用了两次)。我放弃了这条路线,现在只想执行以下操作来运行我的测试:

rake db:seed RAILS_ENV=test
rake test

任何帮助表示赞赏。我基本上想防止 rake test 删除我的数据,或者想办法不让 db/seeds.rb 调用两次。

4

2 回答 2

1

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

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

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

如果您仍想使用种子数据运行测试,您可以随时尝试并运行rspec,它只会运行您所有的 rspec 示例,而测试数据库保持原样。但请相信,这不是你想要的。

于 2013-02-27T23:36:04.287 回答
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
于 2013-02-27T23:42:25.063 回答