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

时间:2014-03-02 23:50:54

标签: 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

我编辑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)应用程序,我可以指望这个默认的测试环境。我错过了什么?

4 个答案:

答案 0 :(得分:6)

神秘解决了,给了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 。所有这些的重要性在于,某些设置会认为它正在开发中运行,然后测试将在“测试”环境中运行。

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

答案 1 :(得分: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)

正如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'行一样简单。

希望有所帮助。

答案 2 :(得分:1)

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

你需要做的就是把它解决掉,问题就消失了。

答案 3 :(得分:0)

据我所知,不应该有任何理由迫使--with­baseaddr=进行测试。因此,如果你的测试是在错误的环境中运行,那么在你的代码中有一些设置env的东西。

对我而言,这是由env导出引起的,我没有意识到有人放置了该应用的Rails.env文件的第一行。

从该文件中删除该.rvmc行并重新启动终端修复了该问题。