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

时间:2015-01-13 01:17:32

标签: ruby-on-rails rspec rake minitest rake-task

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

rake db:seed RAILS_ENV=test

但是,我想要一个 不同的 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

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

rake db:seed_test RAILS_ENV=test

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

rake db:seed_test

更新 :另一个stackoverflow问题与答案的位置相关联:

Rails.env = 'test'

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

2 个答案:

答案 0 :(得分:8)

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)

如果你想使用单独的文件,只需在这个结构中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'

或更短

#db/seeds.rb
require "seeds_#{Rails.env}"
require 'seeds_common'

答案 1 :(得分:0)

如果您使用的是spring,则可以set a Rails environment for a rake task

# config/spring.rb
Spring::Commands::Rake.environment_matchers['db:seed_test'] = "test"

或匹配正则表达式模式的所有任务:

# config/spring.rb
Spring::Commands::Rake.environment_matchers[/^db:.+_test$/] = "test"

这允许你拨打

rake db:seed_test

让它在test Rails环境中运行,从而写入test数据库。

然而,这没有任何影响

  • 如果spring未用于耙子 或
  • 如果没有直接调用rake任务(例如从命令行),而是作为另一个与模式不匹配的rake任务的依赖项