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

时间:2009-10-15 20:21:41

标签: ruby-on-rails testing seed

我正在尝试在Rails 2.3.4+中加载种子数据的新标准方法,即db:seed rake任务。

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

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

8 个答案:

答案 0 :(得分:113)

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

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

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

答案 1 :(得分:83)

我会说它应该是

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)

答案 2 :(得分:18)

在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

答案 3 :(得分:13)

我相信上面的Steve's comment应该是正确的答案。您可以使用Rails.application.load_seed将种子数据加载到测试环境中。但是,加载此数据的时间和频率取决于以下几点:

使用Minitest

在所有测试之前没有方便的方法运行此文件(请参阅this Github issue)。您需要在每次测试之前加载一次数据,可能是在测试文件的设置方法中:

# 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

希望这有帮助。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:3)

对于使用种子库的用户,它会更改种子的加载方式,因此您可能不会/不想使用此处提供的load ...解决方案。

只需将Rake::Task['db:seed'].invoke放入test_helper即可:

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

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

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

答案 6 :(得分:2)

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

load "#{Rails.root}/db/seeds.rb"添加到我的设置方法中工作正常。

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

答案 7 :(得分:0)

根据马特的答案,如果采用这种方式,我建议在Rails.application.load_seed的{​​{1}}块而不是任何文件的before(:suite)块中调用rspec_helper.rb 。这样,整个测试套件只调用一次种子代码,而不是每组测试一次。

rspec_helper.rb:

before(:all)