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

我在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进行测试。 我在模型中设置了一个方法,如果Rails.env.test?存储路径从S3更改为本地Rails.env.test?

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

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

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

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

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

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

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

做的工作。

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

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