Rails 4,新App:为什么测试在开发环境中运行?

我有一个简单的,新的Rails 4应用程序,当我运行rake test:units ,它会破坏开发数据库,​​即使我在test_helper.rb中设置了RAILS_ENV。 我不会想到的。 以下是重现它的简单步骤。

我有Ruby 2.0.0p247和Rails 4.0.1。

 rails new foo rails generate scaffold gadget rake db:migrate 

我编辑test / models / gadget_test.rb看起来像这样:

 require 'test_helper' class GadgetTest < ActiveSupport::TestCase test "the env" do assert_equal "test", Rails.env end end 

我已经编辑了第一行test / test_helper.rb

 ENV["RAILS_ENV"] ||= "test" 

成为

 ENV["RAILS_ENV"] = "test" 

即便如此,当测试调用rake test:units失败:

  1) Failure: GadgetTest#test_the_env test/models/gadget_test.rb:5]: Expected: "test" Actual: "development" 

使用我设置的旧版(Rails 3)应用程序,我可以指望这个默认的测试环境。 我错过了什么?

神秘的解决了,j_mcnally的帽子很大!

要强制Rails环境在Rails 4中“测试”(可能更早),将test_helper.rb的第一行更改为

 ENV["RAILS_ENV"] = "test" 

这无法重置Rails.env的缓存值,但是如果您调用

 Rails.env = "test" 

它将正确重置缓存的值。 也就是说,还有其他地方已经调用Rails.env,否则不会设置缓存。 一个显而易见的是application.rb中的bundler设置,它有Bundler.require(:default, Rails.env)并将其更改为Bundler.require(:default, ENV['RAILS_ENV']) (以避免设置缓存)仍表示初始化中的其他位置也必须调用Rails.env。 所有这些的重要性在于,某些设置会认为它在开发中运行,然后测试将在“测试”环境中运行。

答案:我有办法得到我想要的东西,但可能仍然存在潜伏在那里的危险点。

TL; DR确保在config/application.rb没有注释掉require 'rails/test_unit/railtie'


我遇到了同样的问题,试图将Minitest作为TestUnit的替代品,并在没有它的情况下生成Rails应用程序( rails new foobar --skip-test-unit ),但Minitest仍然使用rails的测试任务。

我在config/applicaiton.rb有以下代码:

 # require 'rails/test_unit/railtie' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) 

正如j_mcnally和Fitter Man指出的那样,问题是Rails.envENV['RAILS_ENV']设置之前缓存了它的值,在我的情况下它被调用在Rails.groups

试图在Rails源代码中找到它在调用rake任务时如何设置正确的test ,我发现它在rails/test_unit/railtie.rb中已经注释掉了。

所以解决方案就像取消注释require 'rails/test_unit/railtie'一样简单。

希望有所帮助。

真正的答案:在我的个人资料引用的shell脚本中有一个迷路export RAILS_ENV="development" 。 所以这是一个座位到键盘界面的失败,直接从2013年10月31日开始在这个post中: https : //github.com/rails/rails/issues/7175

所有你需要做的就是把它拿出去,问题就消失了。

据我所知,不应该有任何理由强迫Rails.env进行测试。 因此,如果您的测试是在错误的环境中运行,那么在代码中的某处设置env就会有所改变。

对我来说,它是由env导出引起的,我没有意识到有人放在应用程序的.rvmc文件的第一行。

从该文件中删除该export RAILS_ENV=development行并重新启动终端修复了该问题。