Rails4にバージョンアップしてRSpecでハマったこと

ソフトウェア開発

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

釈然としないけど。。

参考