Rails 4.0 Spork / ActiveRecord исключение
Я использовал учебник Майкла Хартла Rails, Чтобы подобрать Ruby on Rails, и недавно прошел через новую версию руководства Rails 4.0. Я столкнулся с проблемой с Spork; я знаю, что мы используем пользовательскую вилку Spork для совместимости Rails 4.0, и что это может быть просто другая несовместимость, но я хотел опубликовать свою проблему и посмотреть, не делаю ли я что-то неправильно или у кого-то есть какие-то идеи. Всякий раз, когда я звоню в RSpec, пока Спорк работает, я получаю Исключение ActiveRecord, в то время как если я вызываю RSpec сам по себе, мои тесты выполняются успешно-пример терминального дампа ниже:
oren@VM:~/ruby_projects/test_app$ rspec
Exception encountered: #<ActiveRecord::ConnectionNotEstablished: ActiveRecord::ConnectionNotEstablished>
backtrace:
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:546:in `retrieve_connection'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:79:in `retrieve_connection'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:53:in `connection'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:792:in `current_version'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:800:in `needs_migration?'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:379:in `check_pending!'
/home/oren/ruby_projects/test_app/spec/spec_helper.rb:105:in `<top (required)>'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:11:in `block in run'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:21:in `block in initialize'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:18:in `fork'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:18:in `initialize'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:9:in `new'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:9:in `run'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/server.rb:48:in `run'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1588:in `perform_without_block'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1548:in `perform'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1626:in `block (2 levels) in main_loop'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1622:in `loop'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1622:in `block in main_loop'
Я могу предоставить любые файлы из моего приложения по запросу, я просто не уверен, что было бы наиболее полезным. Я в основном следовал первым шагам Главы 3 учебника (настройка нового приложения, добавление контроллера StaticPages, настройка RSpec и добавление первой спецификации) и инструкциям по настройке Guard и Spork (разделы 3.6.2 и 3.6.3).
Спасибо за вашу помощь!
4 ответа:
У вашего
spec/spec_helper.rb
, вероятно, есть проблемы. Замените то, что у вас есть, на https://github.com/railstutorial/sample_app_rails_4/blob/master/spec/spec_helper.rb и посмотрим, избавится ли это от проблемы.
У меня была та же проблема, но я не могу понять, что вы подразумеваете под перемещением "существующей среды" в Спорк.переходный блок. Насколько я могу судить, листинг 3.37 должен быть полным spec/spec_helper.файл rb. Однако этот файл не работал для меня: я получил сообщение "ошибка соединения не установлена".
Edit: Ах, я наконец-то понял, что вы имеете в виду. В версии spec / spec_helper.RB файл, который не будет работать для меня, есть огромный блок комментариев на конец файла, который бежит от нижней части моего текстового редактора, и после этих комментариев есть еще один блок prefork, скрывающийся. Поэтому вам следует скопировать листинг 3.37, а затем открыть spec/spec_helper.rb и "выбрать все", затем вставить.
С другой стороны, spec/spec_helper.файл rb на github действительно работал на меня. Я провел различие между двумя файлами, и версия Git hub отличается в конце блока prefork:
Листинг 3.37:
config.order = "random" config.include Capybara::DSL end end
Github:
config.order = "random" # Include the Capybara DSL so that specs in spec/requests still work. config.include Capybara::DSL # Disable the old-style object.should syntax. config.expect_with :rspec do |c| c.syntax = :expect end end end
Я не знаю. понятно, как добавленный код имеет какое-либо отношение к соединениям, но после многократных попыток листинга 3.37 и получения ошибки соединения, я изменил файл на версию github, и я получил такой вывод:
$ time bundle exec rspec spec/requests/static_pages_spec.rb --drb ........ Finished in 0.19795 seconds 8 examples, 0 failures Randomized with seed 27433 real 0m5.568s user 0m3.617s sys 0m0.832s
Затем я изменил spec/spec_helper.rb вернулся к версии в листинге 3.37, и я снова получил ошибку подключения. Поэтому листинг 3.37 просто не работает (Edit: Yes it does, see initial edit).
Edit: Примечание: Если вы используете листинг 3.37, вы не будете получаем следующие ошибки:
Затем, сделав еще несколько шагов в учебнике, я заметил, что Guard выводит ошибки тестирования:
Failures: 1) StaticPagesController GET 'home' returns http success Failure/Error: response.should be_success NoMethodError: undefined method `should' for #<ActionController::TestResponse:0x000001046dba00> # ./spec/controllers/static_pages_controller_spec.rb:8:in `block (3 levels) in <top (required)>' 2) StaticPagesController GET 'help' returns http success Failure/Error: response.should be_success NoMethodError: undefined method `should' for #<ActionController::TestResponse:0x00000104700058> # ./spec/controllers/static_pages_controller_spec.rb:15:in `block (3 levels) in <top (required)>' Finished in 0.24867 seconds 13 examples, 2 failures, 3 pending
Эти ошибки происходят из автоматически генерируемых тестовых файлов, использующих метод should (), который является версией GitHub spec/spec_helper.файл rb отключен:
# Disable the old-style object.should syntax. config.expect_with :rspec do |c| c.syntax = :expect end
Ранее в учебнике мы запускали только тесты в одном файле:
spec/requests/static_pages_spec.rb
Но теперь Guard и Spork настроены на выполнение всех тестов во всех тестах файлы.
Чтобы избавиться от ошибок тестирования, я просто закомментировал код в:
/spec/controllers/static_pages_controller_spec
Есть также несколько различных цветных выходных данных от Guard, которые говорят:
Pending: ...
Учебник еще не говорил об этом, но в тесте вы можете просто написать "ожидание", например:
describe StaticPagesHelper do pending "add some examples to (or delete) #{__FILE__}" end
А затем, когда вы запустите тесты, выходные данные напомнят вам, что вы все еще должны написать тест, отображая "ожидающие" выходные данные. Если вы посмотрите в:
spec/helpers/static_pages_helper_spec.rb
Вот где что до критерия.
Я получал ту же самую ошибку. Я думаю, это происходит из-за того, что я управлял охраной и спорком одновременно. Если вы следуете учебнику, он никогда не говорит вам выйти из guard перед настройкой spork. Если вы выйдете из guard и просто запустите spork, а затем эту команду, вы не получите ошибку. Следующим шагом в уроке показано, как работать охранником и ложкой одновременно.