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)应用程序,我可以依靠这个默认的测试环境.我错过了什么?
神秘的问题解决了,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.所有这些的重要性在于,某些设置会认为它正在开发中运行,然后测试将在"测试"环境中运行.
答案:我有办法得到我想要的东西,但可能仍然存在潜伏在那里的危险点.
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.env在ENV['RAILS_ENV']设置之前缓存它的值,在我的情况下它被调用Rails.groups.
试图在Rails源代码中找到它test在调用rake任务时如何设置正确的env,我发现它在rails/test_unit/railtie.rb注释掉的内容中确实如此.
所以解决方案就像取消注释一样简单require 'rails/test_unit/railtie'.
希望有所帮助.
export RAILS_ENV="development"真正的答案:我的个人资料引用的 shell 脚本中有一个迷失。因此,这是一个座椅到键盘接口故障,直接来自 2013 年 10 月 31 日的此线程:https://github.com/rails/rails/issues/7175
您所需要做的就是将其删除,问题就会消失。
| 归档时间: |
|
| 查看次数: |
2205 次 |
| 最近记录: |