11

自動ロードに関連していると思われる何かが原因で、一連の RSpec テストを実行する際に問題が発生しています。エラーは次のとおりです。

/usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:490:in `load_missing_constant': Expected /var/lib/jenkins/.../portfolios/base_manage_controller.rb to define Portfolios::BaseManageController (LoadError)
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:181:in `block in const_missing'
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:179:in `each'
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:179:in `const_missing'
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/ext/module.rb:36:in `const_missing'
from /var/lib/jenkins/jobs/.../app/controllers/portfolios/customize_controller.rb:1:in `<top (required)>'

ファイルのヘッダーは次のとおりです。

class Portfolios::BaseManageController < ApplicationController

そして、それは住んでいますapp/controllers/portfolios/base_manage_controller.rb

そしてそのサブクラス:

class Portfolios::CustomizeController < Portfolios::BaseManageController

そして、それは住んでいますapp/controllers/portfolios/customize_controller.rb

最後に、一連のオートロードを次に示します。

config.autoload_paths += Dir["#{config.root}/lib",  "#{config.root}/lib/**/"]
config.autoload_paths += %W(#{config.root}/app/models/statistics)

#Any test/dev specific load paths
if not Rails.env.production?
  config.autoload_paths += %W(#{config.root}/spec/support)
  config.autoload_paths += %W(#{config.root}/spec/support/builders)
  config.autoload_paths += %W(#{config.root}/spec/support/modules)
  config.autoload_paths += %W(#{config.root}/spec/support/utils)
end

どんな助けでも大歓迎です!

4

4 に答える 4

2

このエラーは、クラスの定義時に例外が発生した場合に発生することがあります。この場合、base_manage_controller.rbにあるクラスを定義しようとすると、ランタイムエラーが発生する可能性があります。

これが当てはまるかどうかを確認するにはbase_manage_controller.rb、クラス宣言を除いて、からすべてを削除してみてください。

class Portfolios::BaseManageController < ApplicationController
end

スペックは実行されますが、失敗するはずです。

ランタイムエラーを見つけるには、すべてをクラスに戻しscript/console、を呼び出してからロードしPortfolios::BaseManageControllerます。これにより、クラスが動的にロードされ、クラスの定義を妨げる例外が発生します。

于 2012-12-15T11:16:23.107 に答える
0

がロードされてPortfoliosいるときにそれが定義されていないようです。どこで定義しましたか? 別のファイルのどこかにモジュールまたはクラスとして定義されている場合は、最初にこのファイルを作成する必要があります。rspecPortfolios::BaseManageControllerPortfoliosrequire

于 2012-08-30T09:26:32.750 に答える
0

次の解決策が役立ちます

次のパスに app/controllers/portfolios/base_manage_controller.rb spec/controllers/portfolios /base_manage_controller_spec.rb の仕様を作成します

スペック内容はこんな感じ

describe Portfolios::BaseManageController do
 -----
end

app/controllers/portfolios/customize_controller.rb にも同じロジックを適用できます

于 2012-12-03T07:08:06.943 に答える
0

/var/lib/jenkins/.../portfolios/base_manage_controller.rb に同じ名前のファイルが存在するため、オートロード パスに衝突があります。

アプリ/コントローラーがリストの前に来るようにロード パスを変更するか、上記のパスで指定されたファイルの名前を変更するか削除する必要があります。

于 2012-09-30T19:09:08.203 に答える