目次
はじめに
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)
https://github.com/plataformatec/devise/wiki/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をしっかりと読み込んでみてくださいね!