我的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调用两次的方法。
答案 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