23

私は、Michael Hartl のRails チュートリアルを使用して Ruby on Rails を取り上げており、最近、このチュートリアルの新しい Rails 4.0 バージョンを試しています。Spork で問題が発生しました。Rails 4.0 との互換性のために Spork のカスタム フォークを使用していることは知っていますが、これは別の非互換性である可能性があります。Spork の実行中に 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

4 に答える 4

58

おそらくspec/spec_helper.rb問題があります。あなたが持っているものをhttps://github.com/railstutorial/sample_app_rails_4/blob/master/spec/spec_helper.rbに置き換えて、問題が解決するかどうかを確認してください。

于 2013-06-26T13:59:08.337 に答える
1

私は同じ問題を抱えていましたが、「既存の環境」を Spork.prefork ブロックに移動するという意味がわかりません。私が知る限り、リスト 3.37 は完全な spec/spec_helper.rb ファイルであるはずです。ただし、そのファイルは機能しませんでした。「接続が確立されていません」というエラーが発生しました。

編集:ああ、やっとあなたの言いたいことがわかりました。私にとっては機能しないバージョンの spec/spec_helper.rb ファイルでは、ファイルの最後にコメントの巨大なブロックがあり、テキスト エディターの下部からはみ出し、それらのコメントの後に別のプリフォークがあります。ブロック隠し。したがって、リスト 3.37 をコピーして、spec/spec_helper.rb を開いて「すべて選択」し、貼り付けます。

一方、github の spec/spec_helper.rb ファイルは機能しました。2 つのファイルの diff を実行したところ、prefork ブロックの最後で git ハブのバージョンが異なります。

リスト 3.37:

    config.order = "random"
    config.include Capybara::DSL
  end
end

ギットハブ:

    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

これらの失敗は、spec/spec_helper.rb ファイルの github バージョンが無効にした should() と呼ばれるメソッドを使用する自動生成されたテスト ファイルからのものです。

# Disable the old-style object.should syntax.
config.expect_with :rspec do |c|
  c.syntax = :expect
end

チュートリアルの前半では、1 つのファイルでテストのみを実行していました。

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

それが保留中のテストの出所です。

于 2013-07-31T15:00:28.283 に答える