【问题标题】:Rails 4, New App: Why do tests run in development environment?Rails 4, New App:为什么要在开发环境中运行测试?
【发布时间】:2016-03-29 02:14:48
【问题描述】:

我有一个简单的新 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) 应用程序,我可以依靠这种默认设置为测试环境。我错过了什么?

【问题讨论】:

  • 当我遇到此问题时,将ENV["RAILS_ENV"] ||= "test" 更改为ENV["RAILS_ENV"] = "test" 已修复。你确定你的 test_helper 正在被rake test:units 加载吗?
  • 我认为ENV["RAILS_ENV"] = "test" 被调用太晚了,Rails 可能已经缓存了 Rails.env 的值?
  • RAILS_ENV=test rake test:units 是否按预期工作?
  • @j_mcnally,我确信正在调用 test_helper。为了确认,我将raise "testhelper" 放在该文件的开头。它在任何测试运行之前引发了错误。此外,运行以RAILS_ENV=test 为前缀的命令绝对可以正常运行。
  • 请参阅http://apidock.com/rails/Rails/env/class 如果在设置 ENV["RAILS_ENV"] 之前调用 env ,它似乎会将值缓存为 @_env 它可能会以可变方式将开发缓存为值。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

谜团解开了,向 j_mcnally 致敬!

要强制 Rails 环境在 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。所有这一切的意义在于,一些设置会认为它正在开发中运行,然后测试将在“测试”环境中运行。

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

【讨论】:

    【解决方案2】:

    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)
    

    正如 j_mcnally 和 Fitter Man 所指出的,问题在于 Rails.env 在设置 ENV['RAILS_ENV'] 之前缓存了它的值,在我的情况下,它在 Rails.groups 内部被调用。

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

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

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        据我所知,不应该有任何理由强制Rails.env 进行测试。因此,如果您的测试在错误的环境中运行,则在您的代码中某处设置了环境。

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

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

        【讨论】:

        • 是的,有一个杂散的出口(请参阅我在 2014 年 9 月 4 日的回答)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多