Rails 4,新应用程序:为什么测试在开发环境中运行?

Fit*_*Man 4 ruby-on-rails ruby-on-rails-4

我有一个简单的,新的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
Run Code Online (Sandbox Code Playgroud)

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

require 'test_helper'

class GadgetTest < ActiveSupport::TestCase
  test "the env" do
    assert_equal "test", Rails.env
  end
end
Run Code Online (Sandbox Code Playgroud)

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

ENV["RAILS_ENV"] ||= "test"
Run Code Online (Sandbox Code Playgroud)

成为

ENV["RAILS_ENV"] = "test"
Run Code Online (Sandbox Code Playgroud)

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

  1) Failure:
GadgetTest#test_the_env test/models/gadget_test.rb:5]:
Expected: "test"
  Actual: "development"
Run Code Online (Sandbox Code Playgroud)

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

Fit*_*Man 6

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

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

ENV["RAILS_ENV"] = "test"
Run Code Online (Sandbox Code Playgroud)

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

Rails.env = "test"
Run Code Online (Sandbox Code Playgroud)

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

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


Ant*_*rle 6

TL; DR确保该require 'rails/test_unit/railtie'行未被注释掉config/application.rb


我有同样的问题,尝试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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

希望有所帮助.


Fit*_*Man 1

export RAILS_ENV="development"真正的答案:我的个人资料引用的 shell 脚本中有一个迷失。因此,这是一个座椅到键盘接口故障,直接来自 2013 年 10 月 31 日的此线程:https://github.com/rails/rails/issues/7175

您所需要做的就是将其删除,问题就会消失。