【问题标题】:Rails: Make this rake task aware that it is in the test environmentRails:让这个 rake 任务知道它在测试环境中
【发布时间】:2011-07-28 09:36:09
【问题描述】:

我在lib/tasks 文件夹中定义了以下 rake 任务:

namespace :db do
  namespace :test do
    task :prepare => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end

现在,它的作用是在我运行 rake db:test:prepare 时为测试数据库播种。我这样做是因为我有一些基本记录必须存在才能让应用程序运行,所以它们不是可选的,也不能真正被模拟。

另外,我有一个模型在开发和生产中使用 S3 进行资产存储,但我不希望它使用 S3 进行测试。我在模型中设置了一个方法,将存储路径从 S3 更改为本地 if Rails.env.test?

但是,这不起作用。我想知道 rake 任务是否知道它被调用的环境,结果证明它不是。我把它放在我的seeds.rb 文件的顶部:

puts "Environment Check: Rails Environment = #{Rails.env}"

果然,当任务运行时打印出:Environment Check: Rails Environment = development

那么,我怎样才能重做这个 rake 任务,以便在它为测试数据库播种时知道它正在为测试数据库播种??

【问题讨论】:

  • 如果Rails.env 没有给你正确的值,那真的很奇怪。看看别处(如何/你在叫什么)。
  • 老实说,仅此而已。我在控制台中输入rake db:test:prepare,当它遇到种子任务时,它会输入environment=development

标签: ruby-on-rails ruby-on-rails-3 rake environment seed


【解决方案1】:

我也遇到了这个问题;在我的db/seeds.rb 文件中,我有一个在开发环境中创建用户帐户的块,但是在准备测试环境以运行rake 以进行 RSpec 或 Cucumber 测试时,它们也被创建,这导致了一堵红墙。

更新:我发现best way to specify the environment for rake tasks是在任务中指定环境,最重要的是需要设置环境的语句。所以在这种情况下:

Rails.env = 'test'
Rake::Task["db:seed"].invoke

完成这项工作。

【讨论】:

  • 这很棒——比每次都记住在命令行中设置环境要好得多。谢谢!
  • 这就是驱使我尝试我原来的方法的原因——我无法忍受必须在每个 rake 命令之前加上 RAILS_ENV=test。如果您只有一个任务要运行,则将环境设置为 invoke 的参数是可行的,但在准备块的开头设置它效果最好。
  • 请注意,仅在调用任务之前设置 Rails 环境不足以从特定于环境的文件夹中加载固定装置。这是因为当 rake 在Rails.env = 'test' 之前首次加载时,seed_fu 会初始化夹具路径。为了克服,在Rails.env = 'test' 之后添加一行:ENV["FIXTURE_PATH"] = Rails.root.join('db/fixtures').to_s。这将导致 seed_fu 使用 test 环境而不是您首先执行 rake 命令的 development 环境重新计算夹具路径。
  • 上述注释也适用于seedbank。然后你可能想调用db:seed:test,因为db:seed 会运行你的开发种子。
【解决方案2】:

从阅读db:test tasks's source 来看,他们似乎只关心从 database.yml 中获取测试数据库信息,而不关心他们在哪个实际环境下进行操作。

您可能需要运行 rake db:test:prepare RAILS_ENV=test 以确保您处于测试环境中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2015-03-10
    • 2016-02-13
    • 2015-01-08
    • 2016-11-13
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多