Getting uninitialized constant error when trying t

2020-02-05 13:14发布

I just updated all my gems and I'm finding that I'm getting errors when trying to run Test::Unit tests. I'm getting the error copied below. That comes from creating new, empty Rails project, scaffolding a simple model, and running rake test.

Tried Googling "uninitialized constant" and TestResultFailureSupport. The only thing I found was this bug report from 2007.

I'm using OS X.

These are the gems that I updated right before the tests stopped working:

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

Has anyone else seen this issue? Any troubleshooting suggestions?


UPDATE

On a hunch I downgraded ZenTest from 4.1.3 back to 4.1.1 and now everything works again.

Still curious to know if anyone else has seen this or has any interesting comments or insights.


$ 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条回答
Rolldiameter
2楼-- · 2020-02-05 13:32

This can happen if modules are declared in a single statement when the parent module they are nested inside has not yet been loaded. I haven't looked at the code in those gems, but my hunch is that's what is happening. Chuck's solution would suggest that. calling gem 'test-unit' first will load the parent module, so the setup of zen test ends up working ok.

e.g.

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

Will result in an error if the parent Foo module hasn't already been defined (e.g. by another gem)

A safer way to declare this is

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

May be a bug in Zentest that needs patching.

查看更多
Fickle 薄情
3楼-- · 2020-02-05 13:34

As with aronchick's comment, for me (OS X 10.6) solution was

sudo gem uninstall test-unit

all versions.

查看更多
够拽才男人
4楼-- · 2020-02-05 13:36

I was getting this without mocha or shoulda installed.

This post suggests it's due to an incompatibility in test-unit >= 2.0, which I installed as a dependency for the systools gems. Downgrading to 1.2.3 worked for me, a simple require might also.

查看更多
乱世女痞
5楼-- · 2020-02-05 13:36

You get auto_test to work again with something like

RUBY="ruby  -I.:lib:test -rubygems -e 'gem \"test-unit\"'" autotest
查看更多
forever°为你锁心
6楼-- · 2020-02-05 13:41

Found the (ugly) solution:

gem 'unit/test' must be called inside the tests too, not only in the Rakefile.

查看更多
Lonely孤独者°
7楼-- · 2020-02-05 13:47

I am not a nuby to rails but I am still learning and hopefully always will be :-).

Rails 2.3 production environment using Ruby Enterprise Edition and passenger can produce a totally misleading useless error during startup (/var/log/passenger.log). Something like:

Exception NameError in PhusionPassenger::Rack::ApplicationSpawner (uninitialized constant XXX)

If you run script/console on the production server, you may see:

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

This is happening to me in this instance only in production environment, not staging, not development. After a full day of research and experiments, I have concluded that in the production environment, REE or something must pre-load classes and the pre-loader apparently does not like to see classes being re-opened before they are created (an educated guess).

In app/models/calendar.rb:

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

In 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

The above generic sample code snippet can cause startup issue. I am not sure of the order that pre-loading classes takes place but I suspect that may be the issue. I moved the ‘has_many :events’ into the class definition in app/modeles/calendar.rb and my app now starts without error.

So, a good rule to follow is to put your Active Record Associations (has_many, belongs_to) inside the defining class (where the class is created).

查看更多
登录 后发表回答