我有一个简单的新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)应用程序,我可以指望这个默认的测试环境。我错过了什么?
答案 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)
据我所知,不应该有任何理由迫使--withbaseaddr=
进行测试。因此,如果你的测试是在错误的环境中运行,那么在你的代码中有一些设置env的东西。
对我而言,这是由env导出引起的,我没有意识到有人放置了该应用的Rails.env
文件的第一行。
从该文件中删除该.rvmc
行并重新启动终端修复了该问题。