Получение неинициализированной постоянной ошибки при попытке запустить тесты - PullRequest
12 голосов
/ 17 июля 2009

Я только что обновил все свои гемы и обнаружил, что получаю ошибки при попытке запустить Test :: Unit тесты. Я получаю ошибку, скопированную ниже. Это происходит из-за создания нового пустого проекта Rails, создания простой модели и запуска rake test.

Пробовал поиск в Google "неинициализированной константы" и TestResultFailureSupport. Единственное, что я нашел, было это сообщение об ошибке с 2007 года.

Я использую 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)

Кто-нибудь еще видел эту проблему? Есть предложения по устранению неполадок?


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"

Ответы [ 12 ]

10 голосов
/ 18 июля 2009

Это может произойти, если модули объявлены в одном операторе, когда родительский модуль, в который они вложены, еще не загружен. Я не смотрел на код в этих драгоценных камнях, но моя догадка - вот что происходит. Решение Чака подсказало бы это. вызов gem 'test-unit' сначала загрузит родительский модуль, так что настройка теста дзен в итоге работает нормально.

, например

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

Приведет к ошибке, если родительский модуль Foo еще не был определен (например, другим гемом)

Более безопасный способ объявить это

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

Может быть ошибка в Zentest, которая требует исправления.

5 голосов
/ 17 июля 2009

Это очевидно происходит от использования Test :: Unit 2.0 со старым Test :: Unit. По словам Кохей Суту на RubyForge, можно исправить , позвонив gem 'test-unit' до вас require 'test/unit'.

3 голосов
/ 09 апреля 2010

Вот рецепт test_unit 2.0.7 на Rails 2.3.5:

В config / средах / 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.

3 голосов
/ 24 июля 2009

Как видно из этой ссылки http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/50 это может произойти из-за предварительной инициализации mocha lib. Для предотвращения этого желательно добавить строку

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

в config / environment.rb

1 голос
/ 13 июня 2014

Я не любитель рельсов, но я все еще учусь и, надеюсь, всегда буду: -).

В рабочей среде Rails 2.3 с использованием Ruby Enterprise Edition и пассажирской версии при запуске может возникнуть совершенно вводящая в заблуждение бесполезная ошибка (/var/log/passenger.log). Что-то вроде:

Исключение NameError в PhusionPassenger :: 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 или что-то еще должно предварительно загружать классы, а предварительный загрузчик, по-видимому, не хочет, чтобы классы открывались заново перед их созданием (обоснованное предположение ).

В приложении / models / calendar.rb:

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

В приложении / 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, и теперь мое приложение запускается без ошибок.

Итак, хорошее правило, которому нужно следовать, - помещать ваши ассоциации активных записей (has_many, assign_to) внутри определяющего класса (где класс создается).

1 голос
/ 07 августа 2010

Вы получаете auto_test снова работать с чем-то вроде

RUBY="ruby  -I.:lib:test -rubygems -e 'gem \"test-unit\"'" autotest
1 голос
/ 19 июня 2010

Как и в случае с комментарием Арончика, для меня (OS X 10.6) решение было

sudo gem uninstall test-unit

все версии.

1 голос
/ 19 мая 2010

Я столкнулся с этим сегодня на 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'
1 голос
/ 17 марта 2010

Нашел (некрасивое) решение:

gem 'unit/test' должен вызываться и внутри тестов, а не только в Rakefile.

1 голос
/ 21 ноября 2009

Та же проблема со мной тоже. Ничто из вышеперечисленного не сработало для меня, кроме понижения тестового блока до 1.2.3. Мне не хватает раскраски тестового блока 2.x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...