Rails:让这个rake任务知道它在测试环境中

And*_*rew 16 environment rake ruby-on-rails seed ruby-on-rails-3

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

namespace :db do
  namespace :test do
    task :prepare => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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

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

puts "Environment Check: Rails Environment = #{Rails.env}"
Run Code Online (Sandbox Code Playgroud)

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

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

jbh*_*nah 15

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

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

Rails.env = 'test'
Rake::Task["db:seed"].invoke
Run Code Online (Sandbox Code Playgroud)

做的工作.


oli*_*nes 8

通过阅读db:test tasks的源代码,看起来他们只关心从database.yml获取测试数据库信息,但不关心他们在哪个实际环境下执行它.

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