尝试运行测试时获取未初始化的常量错误

我刚刚更新了所有的gem,我发现在尝试运行Test :: Unit测试时我遇到了错误。 我收到下面复制的错误。 这来自于创建新的空Rails项目,搭建一个简单的模型,以及运行rake test

尝试谷歌搜索“未初始化的常量”和TestResultFailureSupport。 我发现的唯一一件事是2007年的这个错误报告 。

我正在使用OS X.

这些是我在测试停止工作之前更新的gem:

 $ sudo gem outdated Password: RedCloth (4.2.1 < 4.2.2) RubyInline (3.8.1 < 3.8.2) ZenTest (4.1.1 < 4.1.3) bluecloth (2.0.4 < 2.0.5) capistrano (2.5.5 < 2.5.8) haml (2.0.9 < 2.2.1) hoe (2.2.0 < 2.3.2) json (1.1.6 < 1.1.7) mocha (0.9.5 < 0.9.7) rest-client (1.0.2 < 1.0.3) thoughtbot-factory_girl (1.2.1 < 1.2.2) thoughtbot-shoulda (2.10.1 < 2.10.2) 

还有其他人看过这个问题吗? 任何疑难解答建议


UPDATE

我预感ZenTest从4.1.3降级回4.1.1,现在一切都恢复正常。

仍然很想知道是否有其他人看过这个或有任何有趣的评论或见解。


 $ rake test (in /Users/me/foo) /usr/local/bin/ruby -I"lib:test" "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/helpers/users_helper_test.rb" "test/unit/user_test.rb" /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:105:in `const_missing': uninitialized constant Test::Unit::TestResult::TestResultFailureSupport (NameError) from /usr/local/lib/ruby/gems/1.8/gems/test-unit-2.0.2/lib/test/unit/testresult.rb:28 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:158:in `require' from /usr/local/lib/ruby/gems/1.8/gems/test-unit-2.0.2/lib/test/unit/ui/testrunnermediator.rb:9 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:158:in `require' ... 6 levels... from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:214:in `run' from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:12:in `run' from /usr/local/lib/ruby/1.8/test/unit.rb:278 from /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5 /usr/local/bin/ruby -I"lib:test" "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/users_controller_test.rb" 

如果模块在它们嵌套在其中的父模块尚未加载时在单个语句中声明,则会发生这种情况。 我没有看过那些gem中的代码,但我的预感就是发生了什么。 查克的解决方案会暗示这一点。 首先调用gem 'test-unit'将加载父模块,因此zen测试的设置最终正常工作。

例如

 module Foo::Bar def do_stuff # insert awesomeness here... end end 

如果父Foo模块尚未定义(例如,由另一个gem),将导致错误

宣布这个的更安全的方法是

 module Foo module Bar def do_stuff # insert awesomeness here... end end end 

可能是Zentest中需要修补的错误。

这显然来自使用Test :: Unit 2.0和旧的Test :: Unit。 根据RubyForge上的Kouhei Sutou, 可以通过在require 'test/unit'之前调用gem’test gem 'test-unit' 来修复它。

由于此链接建议http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/50 ,可能会由于mocha lib的初步初始化而发生。 为了防止它发生,建议添加线

 config.gem 'test-unit', :lib => 'test/unit' 

to config / environment.rb

以下是Rails 2.3.5上test_unit 2.0.7的配方:

在config / environments / test.rb中:

 config.gem 'test-unit', :version => '2.0.7', :lib => false 

在test_helper.rb中,在require’test_help require 'test/unit'之后立即添加require’test require 'test/unit' require 'test_help'

所以它看起来像这样:

 require 'test_help' require 'test/unit' 

如果收到此错误: %': one hash required (ArgumentError) ,将gem i18n升级到v0.3.6。

我没有安装摩卡或者应该安装它。

这篇文章表明这​​是由于test-unit> = 2.0中的不兼容性 ,我作为systools gems的依赖项安装。 降级到1.2.3对我有用,一个简单的要求也可能。

我也一样。 除了将测试单元降级回1.2.3之外,上面没有提及任何内容对我有用我错过了测试单元2.x的着色

找到(丑陋)解决方案:

Rakefile gem 'unit/test'必须在测试中调用,而不仅仅是在Rakefile

今天我在Mac OS X 10.6上遇到了这个问题。 我的解决方案如下:

 config.gem'test-unit',: lib =>'test / unit',:version =>'1.2.3'
 config.gem'autotest'
 config.gem'黄瓜'
 config.gem'gellow-rails',: lib => false
 config.gem'ffaker',:lib =>'faker'
 config.gem'rspec',:lib => false,:version =>'> = 1.2.0'
 config.gem'rspec-rails',:lib => false,:version =>'> = 1.2.0'
 config.gem'selenium-client',:lib =>'selenium'
 config.gem“thoughtbot-factory_girl”,:lib =>'factory_girl',:source =>“http://gems.github.com”
 config.gem'methbot-shoulda',:lib =>'shoulda'
 config.gem'webrat'
 config.gem'ZenTest',:lib =>'zentest'

与aronchick的评论一样,对我来说(OS X 10.6)解决方案是

 sudo gem uninstall test-unit 

所有版本。

你可以通过类似的东西再次使用auto_test

 RUBY="ruby -I.:lib:test -rubygems -e 'gem \"test-unit\"'" autotest 

我不是铁杆,但我仍在学习,希望永远是:-)。

使用Ruby Enterprise Edition和乘客的Rails 2.3生产环境在启动期间会产生完全误导性的无用错误(/var/log/passenger.log)。 就像是:

PhusionPassenger :: Rack :: ApplicationSpawner中的exceptionNameError(未初始化的常量XXX)

如果在生产服务器上运行脚本/控制台,您可能会看到:

 Loading production environment (Rails 2.3.4) /home/ubuntu/MyApp/shared/bundle/ruby/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:105:in const_missing:NameError: uninitialized constant XXX 

在这种情况下,仅在生产环境中发生这种情况,而不是分期,而不是开发。 经过一整天的研究和实验,我得出结论,在生产环境中,REE或其他东西必须预加载类,而预加载器显然不希望看到类在创建之前被重新打开(有根据的猜测)。

在app / models / calendar.rb中:

  Class Calendar < ActiveRecord::Base # This defines the class End 

在app / models / event.rb中

  Class Event < ActiveRecord::Base # This desined the class End Class Calendar # This is supposed to 're-open' the Calendar class has_many :events end 

上面的通用示例代码段可能会导致启动问题。 我不确定预加载类的发生顺序,但我怀疑这可能是问题所在。 我将'has_many:events'移动到app / modeles / calendar.rb中的类定义中,我的应用程序现在启动时没有错误。

因此,遵循的一个好规则是将您的Active Record Associations(has_many,belongs_to)放在定义类(创建类的位置)中。

如果将以下行添加到environment.rb或config / environments / test.rb中,则应解决此问题

 config.gem "test-unit", :lib => "test/unit", :version => ">=2.0.9", :env => "test" 

我相信如果你使用摩卡,你需要在摩卡线之前添加它。