16

我的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 更改为本地 ifRails.env.test?

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

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

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

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

4

2 回答 2

15

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

更新:我发现为 rake 任务指定环境的最佳方法是在任务中指定环境,尤其是需要设置环境的所有语句。所以在这种情况下:

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

做这项工作。

于 2011-04-29T21:17:19.603 回答
8

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

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

于 2011-04-03T01:48:05.793 回答