2016-03-30 7 views
5

同じ名前のグローバルコントローラがある場合、名前空間コントローラのコントローラ仕様を作成するときに奇妙な問題があります。Rspecコントローラ仕様の名前空間コントローラで同じ名前のグローバルコントローラが見つかりました

コントローラ名はHomeControllerBackend::HomeControllerです。 私はまだファイルapp/controllers/backend/home_controller.rbを作成していない、唯一のグローバルコントローラはapp/controllers/home_controller.rb

が存在することを

注したがって、私はテストがエラーで爆発を期待するが、それはしていません。それは、すべての緑と幸せを渡します。

私のスペックはこの

#spec/controllers/backend/home_controller_spec.rb 
require 'rails_helper' 

RSpec.describe Backend::HomeController, type: :controller do 
    before do 
    user = FactoryGirl.create(:user) 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    allow(controller).to receive(:current_user).and_return(user) 
    end 
    describe "GET #index" do 
    it "returns http success" do 
     get :index 
     expect(response).to have_http_status(:success) 
    end 
    end 

end 

私は例えば、他の何かに私のグローバルHomeControllerに名前を変更する場合はNotMyHomeControllerテストは私がいることを疑うになり

Unable to autoload constant HomeController, expected app/controllers/home_controller.rb to define it 

を言って、エラーで失敗するようになります。 Rspecは、Rspec.describe関数の "バックエンド"の部分を気にしません。

何か間違っているのですか他の重要な部分がありませんか? IMHO、この仕様は(Gandalfの言い換えに)渡すべきではありません。マックスが指摘したように、私はRailsの4.2.6を使用してい

、RSpecの-Railsの3.4.2

更新

が、これは代わりにRailsの自動ロードで何かRSpecの問題ではおそらくありませんが。

しかし私はRailsのコンソールで

Backend::HomeController 

を入力してみましたが、私は、コンソールおよびテストスイートのオートロードの両方、

NameError: uninitialized constant Backend::HomeController 

そしてaccording to the Rails guide予想されるエラーをそこに着きます。しかし、私はここで正しい道にいると思う。

+0

I Railsのオートローダが何かをやっていると思っています。これは通常、 'NameError:uninitialized constant Backend :: HomeController'を生成した' Object.const_missing'をmonkeypatchすることによって動作します。それはRSpecにはほとんどない。 – max

+0

ありがとうございました。 Railsオートローダをさらに調べる方法について提案はありますか? –

+0

http://guides.rubyonrails.org/autoloading_and_reloading_constants.html – max

答えて

1

私は前にこの同じ問題を抱えていた - あなたはここで全体の問題について読むことができます:

Object.const_get and Rails - cutting off parent module names

が、答えの肉は、ユーザーApneadivingからthisの回答から来ている:

Be aware that there are vicious cases in Rails development mode. In order to gain speed, the strict minimum is loaded. Then Rails looks for classes definitions when needed.

But this sometimes fails big time example, when you have say ::User already loaded, and then look for ::Admin::User . Rails would not look for it, it will think ::User does the trick.

This can be solved using require_dependency statements in your code.

+0

ありがとう!私は 'require_dependency"#{:: Rails.root}/app/controllers/backend/home_controller'を仕様のトップに追加して問題を解決しました –

関連する問題