【问题标题】:How to seed test data in Rails not using seeds.rb?如何在 Rails 中播种测试数据而不使用 seed.rb?
【发布时间】:2015-03-10 21:39:19
【问题描述】:

我有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 开始):(.

【问题讨论】:

  • 不幸的是,对那个重复问题的回答(这不是真正的重复)不起作用:(。Rails.env = 'test' 实际上并没有改变环境,种子数据进入开发数据库。
  • 不是吗?我刚刚对其进行了测试,它绝对适合我(仅添加到 test.sqlite3 的数据)。 (我复制了你的代码,将Rails.env = 'test' 放在load 的上方。)我还运行Rails 4.2.0。
  • 加载测试数据是一个非常普遍的需求。最常见的方法是使用夹具来存储测试数据。为什么不使用fixtures和rake db:fixtures:load
  • @Amadan - 我热情地尝试了这个Rails.env = 'test',但它只将数据加载到development.sqlite3 数据库,而不是test.sqlite3 数据库。让我质疑Rails.env = 'test' 声明的目的。 @blowmage,固定装置似乎很有意义,我只是继续阅读永远不应该使用固定装置......

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


【解决方案1】:

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'

【讨论】:

  • 这不是我的问题。我想一直写入我的测试数据库。
  • 哦,我认为定义一个自定义 rake 任务以将特定于测试的种子写入您的测试数据库只是您想要做的如果没有简单的方法rake db:seed RAILS_ENV=test 将特定于测试的种子写入您的测试数据库。
  • 字符串插值需要使用双引号:require "seeds_#{Rails.env}"
  • @VictorHugoBueno 感谢您的提醒。现已修复。
【解决方案2】:

如果你使用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 DB。

但是,这没有任何作用

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

【讨论】:

  • 这个看起来很有趣,明天试试
猜你喜欢
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多