【问题标题】:Getting uninitialized constant error when trying to run tests尝试运行测试时出现未初始化的常量错误
【发布时间】:2009-07-17 19:48:51
【问题描述】:

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

尝试谷歌搜索“未初始化的常量”和 TestResultFailureSupport。我唯一找到的是 2007 年的 this bug report

我使用的是 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)

有其他人看到这个问题吗?有任何故障排除建议吗?


更新

凭直觉,我将 ZenTest 从 4.1.3 降级回 4.1.1,现在一切正常。

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


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

【问题讨论】:

  • 仅供参考,对于在 Windows 上尝试此操作的任何人,我都遇到了完全相同的问题。我卸载了 test-unit ('gem uninstall test-unit') 及其所有依赖项,就这样完成了。
  • 我在 Linux 机器上遇到了这个问题,卸载 test-unit gem 也对我有用

标签: ruby-on-rails ruby testing


【解决方案1】:

如果在单个语句中声明模块时嵌套在其中的父模块尚未加载,则可能会发生这种情况。我还没有查看这些 gem 中的代码,但我的直觉是正在发生的事情。 Chuck 的解决方案表明了这一点。首先调用gem 'test-unit' 将加载父模块,因此zen test 的设置最终可以正常工作。

例如

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

【讨论】:

  • 这行得通……只要你没有用你的“补丁”覆盖现有的功能。在这种情况下,当模块从“基础”库加载时,它会覆盖你的补丁。我喜欢使用module Foo::Bar 来确保在我的补丁之前已经加载了“基础”。这也是为什么我更喜欢Foo.class_eval 而不是使用class Foo 重新打开。
【解决方案2】:

这显然来自于将 Test::Unit 2.0 与旧的 Test::Unit 一起使用。根据 RubyForge 上的 Kouhei Sutou 的说法,它在 require 'test/unit' 之前调用 gem 'test-unit' can be fixed

【讨论】:

  • 或卸载测试单元 gem(如果这是一个可用的选项)。
【解决方案3】:

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

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

到 config/environment.rb

【讨论】:

  • 在可行的情况下,请注意您也可以只放入 config/environments/test.rb
【解决方案4】:

以下是 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。

【讨论】:

    【解决方案5】:

    我在没有安装 mocha 或 shoulda 的情况下得到这个。

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

    【讨论】:

      【解决方案6】:

      我也有同样的问题。 除了将测试单元降级回 1.2.3 之外,上面提到的没有对我有用 我错过了测试单元 2.x 的着色

      【讨论】:

      • 您可以添加redgreen gem 以恢复您的着色。
      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

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

        config.gem 'test-unit', :lib => 'test/unit', :version => '1.2.3' config.gem '自动测试' config.gem '黄瓜' config.gem '黄瓜导轨', :lib => false config.gem 'faker', :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-should', :lib => 'should' config.gem 'webrat' config.gem 'ZenTest', :lib => 'zentest'

        【讨论】:

          【解决方案9】:

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

          sudo gem uninstall test-unit
          

          所有版本。

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

              我不是 Rails 的忠实用户,但我仍在学习,希望永远都是 :-)。

              使用 Ruby 企业版和乘客的 Rails 2.3 生产环境在启动期间会产生完全误导性的无用错误 (/var/log/passenger.log)。比如:

              PhusionPassenger::Rack::ApplicationSpawner 中的异常 NameError(未初始化的常量 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
              

              上述通用示例代码 sn-p 可能会导致启动问题。我不确定预加载类发生的顺序,但我怀疑这可能是问题所在。我将“has_many :events”移动到 app/modeles/calendar.rb 中的类定义中,我的应用程序现在可以正常启动了。

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

              【讨论】:

                【解决方案12】:

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

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

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

                【讨论】:

                  猜你喜欢
                  • 2015-11-13
                  • 2017-03-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-02
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多