Rails4にバージョンアップしようとして、RSpecが通らなくなって午前中ずっとハマっていました。。
問題
こんなControllerのクラスがあるとして、
# app/controllers/users_controller.rb class UsersController < ApplicationController # ... end # app/controllers/admin/base_controller.rb class Admin::BaseController < ApplicationController # ... end # app/controllers/admin/users_controller.rb class Admin::UsersController < Admin::BaseController # ... end
こんなスペックがあるとき、
# spec/controllers/users_controller_spec.rb describe UsersController do describe '#index' do it 'shows index json' do get :index, format: :json expect(response.body).to eq expected end end end # spec/controllers/admin/users_controller_spec.rb describe Admin::UsersController do describe '#index' do it 'shows index json' do get :index, format: :json expect(response.body).to eq expected end end end
admin/users_controller_spec.rb
を実行したときに以下のように怒られてしまう。
ActionController::UrlGenerationError: No route matches
Admin::UsersController#indexはcontroller: 'admin/users'
を参照しなければいけないはずなのに、controller: 'users'
を参照してしまい、エラーになってしまう。
解決方法
一時的な解決策でないような気がするけど、それぞれのコントローラスペックでそれぞれのコントローラクラスをrequireすることで症状が改善する。
# spec/controllers/users_controller_spec.rb require 'users_controller' describe UsersController do describe '#index' do it 'shows index json' do get :index, format: :json expect(response.body).to eq expected end end end # spec/controllers/admin/users_controller_spec.rb require 'admin/users_controller' describe Admin::UsersController do describe '#index' do it 'shows index json' do get :index, format: :json expect(response.body).to eq expected end end end
釈然としないけど。。