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 23

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, а затем эту команду, вы не получите ошибку. Следующим шагом в уроке показано, как работать охранником и ложкой одновременно.

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