Получение неинициализированной постоянной ошибки при попытке выполнить тесты
Я только что обновил все свои драгоценные камни, и я обнаружил, что получаю ошибки при попытке тестирования Test:: Unit. Я получаю ошибку, скопированную ниже. Это происходит от создания нового, пустого проекта Rails, создания простейшей модели и запуска rake test
.
Пробовал поиски "неинициализированной константы" и 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"
Ответы
Ответ 1
Это может произойти, если модули объявлены в одном заявлении, когда родительский модуль, в который они вложены внутри, еще не загружен. Я не смотрел код в этих драгоценных камнях, но я подозреваю, что это происходит. Решение Chuck предположило бы это. вызов gem 'test-unit'
сначала будет загружать родительский модуль, поэтому настройка теста zen завершится нормально.
например.
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, которая нуждается в исправлении.
Ответ 2
Это, по-видимому, связано с использованием Test:: Unit 2.0 со старым Test:: Unit. Согласно Kouhei Sutou на RubyForge, может быть исправлено, вызывая gem 'test-unit'
перед вами require 'test/unit'
.
Ответ 3
Как говорится в этой ссылке http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/50
это может произойти из-за предварительной инициализации mocha lib.
Чтобы предотвратить его от happeing, рекомендуется добавить строку
config.gem 'test-unit', :lib => 'test/unit'
в config/environment.rb
Ответ 4
Вот рецепт для test_unit 2.0.7 на Rails 2.3.5:
В config/environment/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
Я получал это без мокко или инста.
Этот пост предполагает это из-за несовместимости в тестовом блоке >= 2.0, который я установил как зависимость для драгоценных камней systools. Переход на 1.2.3 работал у меня, также требовалось простое требование.
Ответ 6
Тот же вопрос со мной тоже.
Ничто из вышеперечисленного не работало для меня, кроме понижения тестового блока до 1.2.3
Мне не хватает раскраски тестового блока 2.x
Ответ 7
Нашел (уродливое) решение:
gem 'unit/test'
также должны быть вызваны внутри тестов не только в Rakefile
.
Ответ 8
Я столкнулся с этим сегодня в 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
Как и в случае с комментарием 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 2.3 с использованием Ruby Enterprise Edition и пассажира могут привести к совершенно ошибочной ошибке при запуске (/var/log/passenger.log). Что-то вроде:
Исключение NameError в PhusionPassenger:: Rack:: ApplicationSpawner (неинициализированная константа XXX)
Если вы запустите консоль script/на рабочем сервере, вы увидите:
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: в определение класса в app/modelses/calendar.rb, и теперь мое приложение запускается без ошибок.
Итак, хорошим правилом является использование ваших ассоциаций Active Record (has_many, принадлежит_to) внутри определяющего класса (где создается класс).
Ответ 12
Если вы добавите следующую строку в свой файл environment.rb или ваш config/environment/test.rb, это должно устранить проблему.
config.gem "test-unit", :lib => "test/unit", :version => ">=2.0.9", :env => "test"
Поверьте, вам нужно будет добавить его до линии мокко, если вы используете мокко.