如何在Rails中使用seeds.rb来测试数据?

at.*_*at. 1 rake rspec ruby-on-rails minitest rake-task

我已经seeds.rb填充了我的开发数据库.我知道我可以seeds.rb使用以下方法轻松应用于我的测试数据库:

rake db:seed RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

但是,我想要一个不同的 seeds.rb文件来填充我的测试数据库.也许吧seeds_test.rb.这对于rails程序员来说一定是一个非常普遍的要求,不是吗?

如果没有简单的方法可以做到这一点rake db:seed:seeds_test RAILS_ENV=test,那么我将如何创建一个rake任务呢?我会想到这样的事情lib/tasks/test_seeds.rake:

namespace :db do
  desc "Seed data for tests"
  task :seed_test => :environment do
    load "#{Rails.root}/db/seeds_test.rb"
  end
end
Run Code Online (Sandbox Code Playgroud)

我认为这样可行,但是我希望我的rake任务能够自动知道只将这个应用到测试数据库而不必指定:

rake db:seed_test RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

如何获取rake任务,以便我必须在命令行中输入:

rake db:seed_test
Run Code Online (Sandbox Code Playgroud)

更新:另一个stackoverflow问题链接到答案的位置:

Rails.env = 'test'
Run Code Online (Sandbox Code Playgroud)

不幸的是,实际上并没有做任何事情(至少从Rails 4.2开始):(.

das*_*s-g 10

db/seeds.rb,测试Rails.env相应种子的值并执行相应的种子:

#db/seeds.rb
case Rails.env
when 'development'
  # development-specific seeds ...
  # (anything you need to interactively play around with in the rails console)

when 'test'
  # test-specific seeds ...
  # (Consider having your tests set up the data they need
  # themselves instead of seeding it here!)

when 'production'
  # production seeds (if any) ...

end

# common seeds ...
# (data your application needs in all environments)
Run Code Online (Sandbox Code Playgroud)

如果你想使用单独的文件,只需require在这个结构中,例如:

#db/seeds.rb
case Rails.env
when 'development'
  require 'seeds_development'    
when 'test'
  require 'seeds_test'
when 'production'
  require 'seeds_production'
end

require 'seeds_common'
Run Code Online (Sandbox Code Playgroud)

或更短

#db/seeds.rb
require "seeds_#{Rails.env}"
require 'seeds_common'
Run Code Online (Sandbox Code Playgroud)