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

Luk*_*ncl 117 testing ruby-on-rails seed

我正在尝试使用Rails 2.3.4+(db:seedrake任务)中加载种子数据的新标准方法.

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

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

rya*_*anb 117

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

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

# or

Rails.application.load_seed
Run Code Online (Sandbox Code Playgroud)

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

  • 在较新版本的rails中,您可以执行以下操作:Rails.application.load_seed (36认同)
  • 我喜欢简单,但出于某种原因,将此行添加到我的`test_helper.rb`并不适用于我虽然http://stackoverflow.com/a/1998520/68210. (4认同)

Eug*_*kov 85

我会说它应该是

namespace :db do
  namespace :test do
    task :prepare => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

因为如果你有config.active_record.schema_format =:sql(db:test:clone_structure是),则不执行db:test:load

  • 为什么不呢?`task'db:test:prepare'=>'db:seed'` (6认同)
  • 用`--trace`运行rake帮助我理解了它是如何工作的. (4认同)
  • @BookOfGreg我自己创建了lib/tasks/test_seed.rake (4认同)
  • 对于Rails 4.0.0,在`Rake :: Task ["db:seed"]之前添加`ActiveRecord :: Base.establish_connection(ActiveRecord :: Base.configurations ['test'])`.invoke` (3认同)
  • @CarsonReinke - 因为那时`db:seed`运行的环境是`开发'......很奇怪. (3认同)
  • @EugeneBolshakov - 实际上,与您的解决方案相同的问题......当`seeds.rb`运行时,环境是`development`.(至少是Rails 3.2.13) (2认同)

小智 17

在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
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 13

我相信史蒂夫上面的评论应该是正确答案.您可以使用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
Run Code Online (Sandbox Code Playgroud)

使用RSpec

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

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

describe "my model..." do
  # your tests here
end
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 到目前为止最佳答案 (2认同)