参考記事
[rspecのテスト環境でdeviseにログインする方法【rails】]
(https://qiita.com/Kohei_Kishimoto0214/items/e29e509b12a6eb484a42)
こちらに大まかな実装の流れを分かりやすく解説して頂いていたので、共有させていただきます。
やりたいこと
上記、参考記事に書かれている方法をRails5でも行えるようにする。
実装
参考記事と照らし合わせながら下記の実装解説をお読みください。
1. support配下を読み込み可能にする
spec_rails_helper.rb (修正前)
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
spec_rails_helper.rb (修正後)
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
コメントアウトのままだとsupport配下が読みこめていないのでコメントアウトを解除。
2. controller_macrosの作成
spec/support/controller_macros.rb (修正前)
module ControllerMacros
def login_admin(admin)
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in admin
end
def login_user(user)
controller.stub(:authenticate_user!).and_return true
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in user
end
end
spec/support/controller_macros.rb (修正後)
module ControllerMacros
def login_admin(admin)
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in admin
end
def login_user(user)
allow(controller).to receive(:authenticate_user!).and_return(user)
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in user
end
end
8行目に注目してください。修正前はstubと書かれていますがこのままだとエラーが出ちゃうので変更。
3. deviseのtest_helperとmacrosをcontroller内で使えるようにする
spec_rails_helper.rb (Rails5未満)
RSpec.configure do |config|
config.include Devise::TestHelpers, type: :controller
config.include ControllerMacros, type: :controller
end
spec_rails_helper.rb (Rails5)
RSpec.configure do |config|
config.include Devise::Test::ControllerHelpers, type: :controller
config.include ControllerMacros, type: :controller
end
3行目に注目してください。config.include Devise::TestHelpers, type: :controllerはRails5からはこの書き方は廃止されたのでconfig.include Devise::Test::ControllerHelpers, type: :controllerに変更。以上です。