如何将db:seed数据自动加载到testing数据库中?

我试图在Rails 2.3.4+, db:seed rake任务中使用新的标准加载种子数据的方式。

我正在加载恒定的数据,这是我的应用程序需要真正正常工作所必需的。

获取db:seed任务在testing之前运行的最佳方式是什么,所以数据是预先填充的?

db:seed rake任务主要是加载db/seeds.rb脚本。 因此只需执行该文件来加载数据。

 load "#{Rails.root}/db/seeds.rb" 

在哪里取决于你正在使用的testing框架,以及是否希望在每次testing之前加载它,或者只是在开始时加载一次。 你可以把它放在setup调用或test_helper.rb文件中。

我会说这应该是

 namespace :db do namespace :test do task :prepare => :environment do Rake::Task["db:seed"].invoke end end end 

因为db:test:load如果你有config.active_record.schema_format =:sql(db:test:clone_structure is)

把这样的东西放在lib / tasks / test_seed.rake应该在db:test:load之后调用种子任务:

 namespace :db do namespace :test do task :load => :environment do Rake::Task["db:seed"].invoke end end end 

我相信史蒂夫上面的评论应该是正确的答案。 您可以使用Rails.application.load_seed将种子数据加载到您的testing环境中。 但是,何时加载数据的频率取决于以下几点:

使用Minitest

在所有testing之前运行这个文件没有一个方便的方法(参见这个Github问题 )。 您需要在每次testing之前加载一次数据,可能在testing文件的设置方法中:

 # test/models/my_model_test.rb class LevelTest < ActiveSupport::TestCase def setup Rails.application.load_seed end # tests here... end 

使用RSpec

使用RSpec before(:all)方法为此模型的所有testing加载种子数据:

 describe MyModel do before(:all) do Rails.application.load_seed end describe "my model..." do # your tests here end 

希望这可以帮助。

我们调用db:seed作为db:test:prepare的一部分,其中:

Rake::Task["db:seed"].invoke

这样,种子数据将在整个testing运行中加载一次,而不是每个testing类一次。

对于那些使用种子库,它会改变如何加载种子,所以你可能不能/不想使用这里提供的load ...解决scheme。

而只是把Rake::Task['db:seed'].invoke into test_helper导致:

 Don't know how to build task 'db:seed' (RuntimeError) 

但是,当我们在之前添加load_tasks时,它工作:

 MyApp::Application.load_tasks Rake::Task['db:seed'].invoke 

添加Rake::Task["db:seed"].invoke db:test:prepare rake任务对我不起作用。 如果我用rake db:test:prepare准备了数据库rake db:test:prepare ,然后进入testing环境中的控制台,我所有的种子都在那里。 但是,种子没有坚持我的testing之间。

load "#{Rails.root}/db/seeds.rb"向我的设置方法添加load "#{Rails.root}/db/seeds.rb"效果不错。

我很乐意让这些种子自动加载并坚持下去,但我还没有find办法做到这一点呢!