如何将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办法做到这一点呢!