如何将 db: 種子数据自动加载到测试数据库中?

我试图在 Rails2.3.4 + (db:seed rake 任务)中使用新的加载种子数据的标准方法。

我正在加载常量数据,这是我的应用程序真正正常运行所必需的。

在测试之前运行 db:seed任务以便预填充数据的最佳方法是什么?

73889 次浏览

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

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


# or


Rails.application.load_seed

放置的位置取决于您正在使用的测试框架,以及您是希望在每次测试之前加载它,还是希望在开始时只加载一次。您可以将其放入 setup调用或 test_helper.rb文件中。

我们正在调用 db: eed 作为 db: test: ready 的一部分,使用:

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

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

在 lib/asks/test _ 種. rake 中放置类似的内容应该在 db: test: load 之后调用播种任务:

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

我觉得应该是

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

因为如果您有 config.active _ record. schema _ format = : sql (db: test: clone _ structis) ,则不执行 db: test: load

Rake::Task["db:seed"].invoke添加到 db:test:prepare rake 任务对我来说不起作用。如果我使用 rake db:test:prepare准备数据库,然后在测试环境中输入控制台,那么所有的种子都在那里。然而,种子并没有在我的测试之间坚持下来。

但是,在我的设置方法中添加 load "#{Rails.root}/db/seeds.rb"工作得很好。

我很想让这些种子自动加载并保持下去,但我还没有找到一种方法来做到这一点!

对于那些使用种子库的用户,它改变了种子的加载方式,所以您可能不能/不想使用这里提供的 load ...解决方案。

只要将 Rake::Task['db:seed'].invoke放入 test _ helper,结果就是:

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

但是,当我们在此之前添加 load _ task 时,它起作用了:

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

我相信上面的 Steve 的评论应该是正确的答案。可以使用 Rails.application.load_seed将种子数据加载到测试环境中。然而,何时以及多久加载一次这些数据取决于以下几点:

使用 Minitest

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

# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase


def setup
Rails.application.load_seed
end


# tests here...


end

使用 RSpec

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

describe MyModel do
before(:all) do
Rails.application.load_seed
end


describe "my model..." do
# your tests here
end

希望这个能帮上忙。

基于 Matt 的回答,如果采用这种方式,我建议在 rspec_helper.rb中的 before(:suite)块中调用 Rails.application.load_seed,而不是在任何文件中的 before(:all)块中调用 Rails.application.load_seed。这样,种子代码对整个测试套件只调用一次,而不是对每组测试调用一次。

Rspec _ helper. rb:

RSpec.configure do |config|
...
config.before(:suite) do
Rails.application.load_seed
end
...
end