代码之家  ›  专栏  ›  技术社区  ›  Ethan

尝试运行测试时出现未初始化常量错误

  •  12
  • Ethan  · 技术社区  · 15 年前

    我刚刚更新了所有的gem,发现在尝试运行test::unit测试时出错了。我要把错误复制到下面。这源于创建新的、空的Rails项目、搭建一个简单的模型以及运行 rake test .

    尝试在Google中搜索“未初始化常量”和TestResultFailureSupport。我唯一发现的是 this bug report 从2007开始。

    我使用的是OS X。

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

    $ 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 回复  |  直到 10 年前
        1
  •  10
  •   madlep    15 年前

    如果模块在一条语句中声明,而它们嵌套在其中的父模块尚未加载,则可能发生这种情况。我没有看过这些宝石中的代码,但我的预感就是这样。查克的解决方案建议这样做。打电话 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中需要修补的错误。

        2
  •  5
  •   Chuck    15 年前

    这显然来自使用test::unit 2.0和旧的test::unit。据《鲁比福尔》上的库伊·苏图说, can be fixed 通过呼叫 gem 'test-unit' 在你面前 require 'test/unit' .

        3
  •  3
  •   Anaderi    15 年前

    正如这个链接所暗示的那样 http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/50 可能是由于mocha lib的初步初始化。 为了防止出现这种情况,最好加一条线。

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

    至config/environment.rb

        4
  •  3
  •   Matt Scilipoti    14 年前

    以下是轨道2.3.5上测试单元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) , 升级宝石 i18n 至V0.3.6。

        5
  •  1
  •   scottburton11    15 年前

    我得到这个没有摩卡或应该安装。

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

        6
  •  1
  •   millisami    15 年前

    我也有同样的问题。 除了将测试单元降级回1.2.3,上述内容对我没有任何效果。 我不知道测试单元2.x的颜色。

        7
  •  1
  •   Elia Schito    14 年前

    找到了(难看的)解决方案:

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

        8
  •  1
  •   Martin Streicher    14 年前

    我今天在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'
    
        9
  •  1
  •   Simon Woodside    14 年前

    正如Aronchick的评论,对于我(OS X 10.6)的解决方案是

    sudo gem uninstall test-unit
    

    所有版本。

        10
  •  1
  •   sth ypicasso    13 年前

    你可以通过自动测试来再次使用

    RUBY="ruby  -I.:lib:test -rubygems -e 'gem \"test-unit\"'" autotest
    
        11
  •  1
  •   GeezerGeek    10 年前

    我不是Rails的Nuby,但我仍在学习,希望永远是:—)。

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

    phusionPassenger::Rack::ApplicationProwner中的异常名称错误(未初始化常量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
    

    应用程序/模型/事件.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
    

    上述通用示例代码段可能导致启动问题。我不确定预加载类的顺序,但我怀疑这可能是问题所在。我在app/models/calendar.rb中将“has-many:events”移动到类定义中,现在我的应用程序启动时不会出错。

    因此,要遵循的一个好规则是将您的活动记录关联(has ou many,ownerse ou to)放在定义类(类的创建位置)中。

        12
  •  0
  •   sth ypicasso    13 年前

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

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

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