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

时间:2009-07-17 19:48:51

标签: ruby-on-rails ruby testing

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

尝试使用Google搜索“未初始化的常量”和TestResultFailureSupport。我发现的唯一一件事就是2007年this bug report

我正在使用OS X.

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

$ 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)

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


更新

在预感中,我将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"

12 个答案:

答案 0 :(得分:10)

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

e.g。

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中需要修补的错误。

答案 1 :(得分:5)

这显然来自使用Test :: Unit 2.0和旧的Test :: Unit。根据RubyForge上的Kouhei Sutou,gem 'test-unit'在你require 'test/unit'之前调用{{1}}。{/ p>

答案 2 :(得分:3)

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

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

到config / environment.rb

答案 3 :(得分:3)

以下是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/unit', 在require 'test_help'之后立即

所以它看起来像这样:

require 'test_help'
require 'test/unit'

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

答案 4 :(得分:1)

我没有使用mocha或者应该安装它。

This post suggests it's due to an incompatibility in test-unit >= 2.0,我作为systools gems的依赖项安装。降级到1.2.3对我有用,也可能是一个简单的要求。

答案 5 :(得分:1)

我也一样。 除了将测试单元降级回1.2.3之外,上述任何内容都不适用于我 我错过了测试单元2.x的着色

答案 6 :(得分:1)

找到(丑陋的)解决方案:

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

答案 7 :(得分:1)

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

config.gem 'test-unit', :lib => 'test/unit', :version => '1.2.3'
config.gem 'autotest'
config.gem 'cucumber'
config.gem 'cucumber-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 'thoughtbot-shoulda', :lib => 'shoulda'
config.gem 'webrat'
config.gem 'ZenTest', :lib => 'zentest'

答案 8 :(得分:1)

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

sudo gem uninstall test-unit

所有版本。

答案 9 :(得分:1)

你可以通过类似

的方式再次使用auto_test
RUBY="ruby  -I.:lib:test -rubygems -e 'gem \"test-unit\"'" autotest

答案 10 :(得分:1)

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

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

PhusionPassenger中的异常NameError :: Rack :: ApplicationSpawner(未初始化的常量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)放在定义类(创建类的位置)中。

答案 11 :(得分:0)

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

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

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