Ruby on rails 如何在不使用seeds.rb的Rails中设置测试数据种子?

Ruby on rails 如何在不使用seeds.rb的Rails中设置测试数据种子?,ruby-on-rails,rspec,rake,minitest,rake-task,Ruby On Rails,Rspec,Rake,Minitest,Rake Task,我有seeds.rb填充我的开发数据库。我知道我可以使用以下工具轻松地将seeds.rb应用到我的测试数据库: rake db:seed RAILS_ENV=test 但是,我需要一个不同的seeds.rb文件来填充我的测试数据库。可能是seeds\u test.rb。这在rails程序员中肯定是一个非常普遍的要求,不是吗 如果没有简单的方法可以做到这一点,比如rake db:seed:seed\u test RAILS\u ENV=test,那么我将如何创建一个rake任务?我会在lib/t

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

rake db:seed RAILS_ENV=test
但是,我需要一个不同的seeds.rb文件来填充我的测试数据库。可能是
seeds\u test.rb
。这在rails程序员中肯定是一个非常普遍的要求,不是吗

如果没有简单的方法可以做到这一点,比如
rake db:seed:seed\u test RAILS\u ENV=test
,那么我将如何创建一个rake任务?我会在
lib/tasks/test\u 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开始):(.

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)
如果要使用单独的文件,只需
在此结构中要求它们,例如:

#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'

如果您使用的是
spring
,则可以:

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

# config/spring.rb
Spring::Commands::Rake.environment_matchers[/^db:.+_test$/] = "test"
这允许你打电话

rake db:seed\u测试
并让它在
test
Rails环境中运行,从而写入
test
DB

但是,这没有任何效果

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

可能重复不幸的是,这个重复问题的答案(不是真正的重复)不起作用:(.
Rails.env='test'
实际上没有改变环境,种子数据进入开发数据库。不是吗?我只是测试了它,它肯定对我有效(数据仅添加到
test.sqlite3
)(我复制了您的代码,将
Rails.env='test'
放在
load
的正上方)我还运行Rails 4.2.0。加载测试数据是一个非常常见的要求。最常见的方法是使用fixture作为测试数据。为什么不使用fixture和
rake db:fixture:load
?@Amadan-我热情地尝试了这个
Rails.env='test'
,但它只将数据加载到
development.sqlite3
数据库,n
test.sqlite3
数据库。这让我质疑
Rails.env='test'
语句的用途。@blowmage,fixture似乎很有意义,我只是一直在读fixture永远不应该被使用……这不是我的问题。我想一直写到我的测试数据库。哦,我想定义一个自定义
rake
任务只有在没有简单的方法将测试特定的种子写入测试数据库时,才需要将测试特定的种子写入测试数据库:
rake db:seed RAILS_ENV=test
将测试特定的种子写入测试数据库。字符串插值需要使用双引号:
require“seeds_35;{RAILS.ENV}”
@VictorHugoBueno感谢您的提醒。现在已修复。这看起来非常有趣,明天将尝试
# config/spring.rb
Spring::Commands::Rake.environment_matchers[/^db:.+_test$/] = "test"