Deviseのテストを行う際の注意

スポンサーリンク

はじめに

Railsを愛する初学者の皆さんはgemのdeviseに悩まされていることでしょう。
TDD(テスト駆動開発)の重要性もわかってきて、ちゃんとテストをしたいなぁと思って際にどうやってテストを通せばいいのか悩み始めたあなた。
このサイトはそんなあなたにぴったりの情報をお届けします!

環境

Railsのバージョン

5.2.2.1

deviseのバージョン

4.7.1

RSPECのバージョン

3.9

githubを参照しましょう

いつも通り、githubを見にいきましょう!
Minitestのコントローラーと統合テスト、コントローラーspecでのやり方が載っているようです。

How To: Test controllers with Rails (and RSpec)

)

rails_helper.rbの設定

まずは下記の通りにrails.helper.rbに記述をしますdeviseのバージョンが4.1.1.を境に記述に若干の差があるので注意してください!

# spec/rails_helper.rb
require "spec_helper"
require "rspec/rails"
# require "devise"はrspec/rails"の後に記述しなくてはいけないので注意!
require "devise"

RSpec.configure do |config|
  #  Deviseのバージョンが4.1.2以上の時は以下のようにします。
  config.include Devise::Test::ControllerHelpers, :type => :controller
  # Deviseのバージョンが4.1.1以下の時は上をコメントアウトして、以下の記述にします。
  # config.include Devise::TestHelpers, :type => :controller
end

controller_macros.rbの作成

次にRspec用のヘルパーメソッドを定義します!これがちょい面倒臭いのですが、チャチャっとやってしまいましょう。

# spec/support/controller_macros.rb
module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      admin = FactoryBot.create(:admin)
      sign_in :user, admin # sign_in(scope, resource)
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryBot.create(:user)
      user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the "confirmable" module
      sign_in user
    end
  end
end

rails_helper.rbに追記

最後にrails_helper.rbに先ほど追加したヘルパーメソッドが使えるよう設定を追記します!
先ほどと同じようにdeviseのバージョンが4.1.1を境に記述に変化があるので注意してください!

require_relative "support/controller_macros" # or require_relative "./controller_macros' if write in `spec/support/devise.rb"

RSpec.configure do |config|
  #  Deviseのバージョンが4.1.2以上の時は以下のようにします。
  config.include Devise::Test::ControllerHelpers, :type => :controller
  # Deviseのバージョンが4.1.1以下の時は上をコメントアウトして、以下の記述にします。
  # config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
end

コントローラーspecでの記述

とうとうコントローラーspecでの記述になります。

describe MyController do
  login_admin

  it "should have a current_user" do
    # note the fact that you should remove the "validate_session" parameter if this was a scaffold-generated controller
    expect(subject.current_user).to_not eq(nil)
  end

  it "should get index" do
    # Note, rails 3.x scaffolding may add lines like get :index, {}, valid_session
    # the valid_session overrides the devise login. Remove the valid_session from your specs
    get 'index'
    response.should be_success
  end
end

終わりに

deviseのgemをしっかりと読み込んでみてくださいね!

未経験者から最強のRailsエンジニアになるためのロードマップ
webアプリエンジニアになるためにどの程度学習すべきかをまとめた記事です。
タイトルとURLをコピーしました