Подтвердить что ты не робот

Исключение Rails 4.0 Spork/ActiveRecord

Я использовал Michael Hartl Rails Tutorial, чтобы забрать Ruby on Rails и недавно просматривал новую версию Rails 4.0 руководство. Я столкнулся с проблемой Spork; Я знаю, что мы используем пользовательскую вилку совместимости Spork for Rails 4.0 и что это может быть просто несовместимостью, но я хотел опубликовать свою проблему и посмотреть, что я делаю что-то неправильно или у кого-нибудь есть идеи. Всякий раз, когда я вызываю RSpec во время работы Spork, я получаю исключение ActiveRecord, а если я сам вызову RSpec, мои тесты успешно выполняются - примерный дамп терминала ниже:

[email protected]:~/ruby_projects/test_app$ rspec
Exception encountered: #<ActiveRecord::ConnectionNotEstablished: ActiveRecord::ConnectionNotEstablished>
backtrace:
/home/oren/.rvm/gems/[email protected]_4_0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:546:in `retrieve_connection'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:79:in `retrieve_connection'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:53:in `connection'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:792:in `current_version'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:800:in `needs_migration?'
/home/oren/.rvm/gems/[email protected]_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/[email protected]_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/home/oren/.rvm/gems/[email protected]_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/oren/.rvm/gems/[email protected]_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:11:in `block in run'
/home/oren/.rvm/gems/[email protected]_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:21:in `block in initialize'
/home/oren/.rvm/gems/[email protected]_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:18:in `fork'
/home/oren/.rvm/gems/[email protected]_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:18:in `initialize'
/home/oren/.rvm/gems/[email protected]_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:9:in `new'
/home/oren/.rvm/gems/[email protected]_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:9:in `run'
/home/oren/.rvm/gems/[email protected]_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).

Спасибо за вашу помощь!

4b9b3361

Ответ 2

У меня была такая же проблема, но я не могу понять, что вы подразумеваете, переместив "существующую среду" в блок Spork.prefork. Насколько я могу судить, листинг 3.37 должен быть полным spec/spec_helper.rb. Однако этот файл не работал у меня: я получил сообщение "connection not installed error".

Изменить: А, наконец, я понимаю, что вы имеете в виду. В версии файла spec/spec_helper.rb, который не будет работать для меня, в конце файла есть огромный блок комментариев, который заканчивается внизу моего текстового редактора, и после этих комментариев есть еще одна предпрограмма блокировать скрытие. Итак, что вам нужно сделать, это скопировать листинг 3.37, затем открыть spec/spec_helper.rb и "выбрать все", а затем вставить.

С другой стороны, файл spec/spec_helper.rb на github действительно работал у меня. Я запускал diff для двух файлов, а версия концентратора git отличается в конце блока предпродажа:

Листинг 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 просто не работает ( Изменить: Да, см. Первоначальное редактирование).

Изменить: Примечание. Если вы используете Листинг 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:
...

Учебник еще не говорил об этом, но в тесте вы можете просто написать "pending", например:

describe StaticPagesHelper do
  pending "add some examples to (or delete) #{__FILE__}"
end

а затем, когда вы запускаете тесты, вывод будет напоминать вам, что вам все равно нужно написать тест, отобразив вывод "Ожидание". Если вы посмотрите на:

spec/helpers/static_pages_helper_spec.rb

где это ожидающее тестирование происходит.

Ответ 3

Я получал такую ​​же ошибку. Я думаю, что это происходит из-за того, что я одновременно работал охранником и spork. Если вы следуете руководству, он никогда не прикажет вам выйти из охраны перед настройкой spork. Если вы выполняете защиту выхода и просто запускаете spork, а затем эту команду, вы не получите ошибку. Следующий шаг в учебном пособии показывает, как одновременно запускать защиту и spork.

Ответ 4

У меня была такая же проблема, и я исправил ее всего несколько минут назад, все было точным в моем файле spec/spec_helper.rb, или так я думал. Оказывается, мне пришлось удалить эту копию верхней части файла, которая была скрыта внизу.