RequestSpecでDeviseを使ったユーザーでログインさせる

今回はインテグレーションテストにはCucumberを使わずRequestSpecを使ってみよーぜーということになった。Deviseでのユーザーをログインさせる方法を考えていたのだが、普通にログイン画面を開いてメアドとパスワードを打たせてログインしてから、さてさて…とやるのは時間がかかるだろうから、いい方法を調べよう!ということになったので、メモ。

参考にしたサイトは以下の通り。

spec_helpers.rbに

RSpec.configure do |config|
  # Devise
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
end

と書けば、というのはあくまでもコントローラーのテストの場合で、RequestSpecではうまくいかなかった。:type => :requestにしてもうまくいかなかった。その後、Warden::Test::Helpersをincludeしてやりなさいという記事を見つけたので、RequestSpec側のファイルで行ったところ、うまくいった。しかし、毎回全部のRequestSpecファイルに書くのは面倒だなーと思って模索していたのだが、ようやくそれっぽい解に辿り着いた。

まず、spec/supportフォルダ以下に、request_helpers.rbを作成し、そこにRequestHelpersモジュールを定義する。

# coding: utf-8
# spec/support/request_helpers.rb
include Warden::Test::Helpers

module RequestHelpers
  def create_logged_in_user
    user = FactoryGirl.build :user, :role => FactoryGirl.create(:role) # Cancan使ってるから権限もある
    user.confirm!
    user.save!
    login(user)
    user
  end

  def login(user)
    login_as user, scope: :user, :run_callbacks => false
  end
end

その後、spec_helpers.rbに以下を定義する。

RSpec.configure do |config|
  # Devise
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
  config.include RequestHelpers, :type => :request
end

これで、適当なspec/requestsフォルダ以下のテストで、以下のようbeforeでcreate_logged_in_userメソッドを使えば、毎回ログイン処理をおこなってくれる。

# coding: utf-8
require 'spec_helper'
describe "Hoges" do

  before do
    create_logged_in_user
  end

  describe "GET /hoges" do
    it "works! (now write some real specs)" do
      get hoges_path
      response.status.should be(200)
    end
  end
end

これでようやくテストをする下地ができたかなぁ〜という感じ。


カテゴリー Ruby, Ruby on Rails | タグ    | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です