Help us understand the problem. What is going on with this article?

RspecでDevise認証を使ったテストを行う方法【Rails5編】

背景

私は現在、渋谷の某プログラミングスクールに通っている。
チーム開発では、アジャイル開発と呼ばれるモダンな開発手法をスクラムを用いてチーム開発を行い、チームでECサイト(メルカリ)のクローンアプリを開発した。
その開発工程の中でRspecでDevise認証を使ったテストを行ったのだが、Rails5でこれを行う方法を簡潔にまとめられている記事がなかったので、これを機にアウトプットします。

参考記事

rspecのテスト環境でdeviseにログインする方法【rails】

こちらに大まかな実装の流れを分かりやすく解説して頂いていたので、共有させていただきます。

やりたいこと

上記、参考記事に書かれている方法を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: :controllerRails5からはこの書き方は廃止されたのでconfig.include Devise::Test::ControllerHelpers, type: :controllerに変更。以上です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away