我有一个简单的新Rails 4应用程序,它在运行rake test:units时会破坏开发数据库,尽管我已经在test_helper.rb中设置了RAILS_ENV。我没想到会这样。以下是复制它的简单步骤。
我有Ruby2.0.0p247和Rails 4.0.1。
rails new foo
rails generate scaffold gadget
rake db:migrate我编辑test/model/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),我可以依赖这个默认的测试环境。我遗漏了什么?
发布于 2014-09-04 11:09:04
真正的答案是:我的个人资料引用的shell脚本中有一个偏离的export RAILS_ENV="development"。这是一个座位到键盘的接口故障,直接从2013年10月31日在这个线程:https://github.com/rails/rails/issues/7175。
你要做的就是把它拿出来,问题就解决了。
发布于 2014-03-04 03:53:56
谜团解开了,给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。所有这些的意义在于,一些设置将认为它正在开发中运行,然后测试将在“测试”环境中运行。
网答:我有办法得到我想要的,但可能仍然有一些危险的地方潜伏在那里。
发布于 2014-06-21 19:34:56
确保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所指出的,问题是Rails.env在ENV['RAILS_ENV']设置之前缓存了它的值,在我的例子中,它是在Rails.groups中被调用的。
为了在Rails源代码中找到在调用rake任务时如何设置适当的test env,我发现它是在被注释掉的rails/test_unit/railtie.rb中设置的。
因此,解决方案就像取消注释require 'rails/test_unit/railtie'行一样简单。
希望这能有所帮助。
https://stackoverflow.com/questions/22135347
复制相似问题