カテゴリー:
Rails
タグ:
 Rails Rspec devise valid_session

このエントリーをはてなブックマークに追加
更新日時:
2013年08月05日(月)
作成日時:
2013年08月05日(月)

前の記事 / 次の記事

生成されたRspecのコントローラーのテストを見ると、

valid_session

とか書いてあって、いかにもここに有効なセッションを定義して使い回そうぜみたいになってるけど、
Deviseのログイン状態を再現するためにはこの valid_session は一切関係ない。関係なかった(´・ω・`)

どうすれば valid_session にDeviseでつくられたセッションを入れられるのか、
って考え始めてしまったのが運の尽き。

で、本家に全部書いてありましたっていうワンパターンなんだけど、
正解は"spec/spec_helper.rb"にDeviseのテスト用ヘルパーを使えるようにする記述を追加して、
テストの中でそのヘルパーを使う。

1st. Deviseのテスト用ヘルパーをRspecの中で使えるようにする

vi spec/spec_helper.rb
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

2nd. 次のヘルパーが使えるようになる

# 次のヘルパーを使うとログイン状態になる
sign_in :user, @user   # sign_in(scope, resource)
sign_in @user          # sign_in(resource)

# 次のヘルパーを使うとログオフ状態になる
sign_out :user         # sign_out(scope)
sign_out @user         # sign_out(resource) 

3rd. テストの中で書く

describe UsersController do
  fixtures :user

  let(:valid_attrigutes) {}
  let(:valid_session) {}

  describe "GET show" do
    it "assigns the requested user as @user" do
      sign_in users(:sample_user)
      get :show, {id: user.to_param}, valid_session
      expect(assigns :story).to eq user
   end
  end
end

4th. 番外編、スタブで無理矢理通す

describe UsersController do
  describe "GET show" do
    it "assigns the requested user as @user" do
      controller.stub(:authenticate_user){true}
      get :show, {id: user.to_param}, valid_session
      expect(assigns :story).to eq user
   end
  end
end

注意点

Deviseの公式のよると、このヘルパーはユニットテストレベルで有効で、
インテグレーションテストとかで使った場合はたぶんちゃんと動かないんじゃない?
っていうことらしいです。

参考

plataformatec/devise
rspec controller test with devise authentication
Railsのユーザ認証deviseを用いた簡単かつ突っ込んだ実装
rspecで、Omniauthのログイン状態を再現したい