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

2024-03-05

我有一个简单的新 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"

to be

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 env 在 Rails 4(可能更早)中“测试”,将 test_helper.rb 的第一行更改为

ENV["RAILS_ENV"] = "test"

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

Rails.env = "test"

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐